Проверка Spring и порядок прокси-сервера Spring не работают

Когда я интегрирую кэш 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).

Это правильный способ установить порядок прокси?

Может ли проблема быть связана с наличием аннотации проверки в интерфейсе и аннотации кеша в реализации?


person Basa    schedule 16.05.2016    source источник
comment
Да, аннотация @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
comment
Спасибо, Джон. Я понял, что, поскольку вы предлагаете правильный вариант, моя иерархия классов не позволяет мне применять оба фильтра: аннотации проверки находятся в общем интерфейсе (CommonDAO), реализованном общим суперклассом (абстрактный класс CommonDAOImpl). Аннотации кэша должны быть разными для каждого класса, расширяющего общий суперкласс (например, CustomerDAOImpl), но я не могу переопределить аннотированные методы ограничения (требование структуры проверки). Может быть, я должен подумать о рефакторинге...   -  person Basa    schedule 17.05.2016


Ответы (1)


Мне удалось решить эту проблему на основе предоставленных предложений здесь, здесь и здесь (для не xml на основе конфигурации).

Суть в том, что порядок MethodValidationPostProcessor — это просто порядок постпроцессоров, а не тот из советов, который нам нужен.

См. фиксацию, чтобы узнать об изменениях, необходимых для решения этой проблемы кэширования/проверки.

person jtonic    schedule 15.08.2017