Когда я интегрирую кэш Spring (с EHCache) и проверку Spring, порядок прокси устанавливается неправильно.
Я хочу, чтобы аннотация проверки была обработана ДО обработки аннотаций кеша (в данном случае CacheEvict).
Мой класс конфигурации:
@EnableCaching( order = Ordered.LOWEST_PRECEDENCE )
@Configuration
public class CommonConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() throws IOException {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor( LocalValidatorFactoryBean validator ) {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator( validator );
methodValidationPostProcessor.setOrder( Ordered.LOWEST_PRECEDENCE- 1 );
return methodValidationPostProcessor;
}
@Bean
public EhCacheCacheManager cacheManager() {
EhCacheCacheManager cacheManager = new EhCacheCacheManager();
cacheManager.setCacheManager( ehCacheManager().getObject() );
return cacheManager;
}
@Bean
public EhCacheManagerFactoryBean ehCacheManager() {
EhCacheManagerFactoryBean ehcache = new EhCacheManagerFactoryBean();
ehcache.setConfigLocation( new ClassPathResource( "ehcache.xml" ) );
return ehcache;
}
}
И мои связанные зависимости:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.2</version>
</dependency>
Интерфейс и реализующий класс с проблемой:
@Validated
public interface MyRepository {
public void update(@NotNull MyEntity entity);
}
@Repository
public class MyRepositoryImpl implements MyRepository {
@CacheEvict(cacheNames = {"entityCache"});
public void update(MyEntity entity);
}
Как видно, я установил для MethodValidationPostProcessor порядок Orderer.LOWEST_PRECEDENCE-1, а порядок кэширования — Ordered.LOWEST_PRECEDENCE (в @EnacbleCaching).
Это правильный способ установить порядок прокси?
Может ли проблема быть связана с наличием аннотации проверки в интерфейсе и аннотации кеша в реализации?
@Validated
на вашем интерфейсе, скорее всего, является проблемой. Как видите, аннотация@Validated
(github.com/spring-projects/spring-framework/blob/v4.2.6.RELEASE/) не является@Inherited
. И даже если бы это было так, поскольку вы аннотировали свойMyRepository
интерфейс с помощью@Validated
, Java все равно не подхватила бы его (см. docs.oracle.com/javase/8/docs/api/java/lang/annotation/). Вместо этого вы должны аннотироватьMyRepositoryImpl
с помощью@Validated
. - person John Blum   schedule 16.05.2016