0

当我集成 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 的 order 设置为 Orderer.LOWEST_PRECEDENCE-1 并将缓存 order 设置为 Ordered.LOWEST_PRECEDENCE (在@EnacbleCaching 中)。

这是设置代理订单的正确方法吗?

问题可能与接口中的验证注释和实现中的缓存注释有关吗?

4

1 回答 1

1

根据此处此处此处提供的建议(对于非基于 xml 的配置),我设法解决了这个问题。

重点是 MethodValidationPostProcessor 的顺序只是后处理器的顺序,而不是我们所追求的建议之一。

请参阅提交以了解解决此缓存/验证问题所需的更改。

于 2017-08-15T12:27:09.787 回答