我有一个关于Spring-MVC和Spring-websockets的项目,我尝试在我的服务层上插入缓存。这些是我的配置:
@Configuration
@ComponentScan(basePackages = {
"com.example"
})
@PropertySource("classpath:/configuration.properties")
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableCaching
public class WebAppConfig extends WebMvcConfigurerAdapter {
@Bean
public EhCacheManagerFactoryBean ehcache() {
EhCacheManagerFactoryBean ehCache = new EhCacheManagerFactoryBean();
ehCache.setConfigLocation(new ClassPathResource("ehcache.xml"));
ehCache.setShared(true);
return ehCache;
}
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehcache().getObject());
}
//...different settings by mvc
}
和我的websocket配置:
@Configuration
@EnableAsync
@EnableWebSocket
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/queue/", "/topic/");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/locations").withSockJS();
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(4).maxPoolSize(10);
}
}
我想在服务层上使用@Cacheable
注释:
@Service
public class StoreServiceImpl implements StoreService {
private static final Log logger = LogFactory.getLog(StoreServiceImpl.class);
@Autowired
private StoreRepository storeRepository;
@Override
@Cacheable("stores")
public Store findById(String storeId) {
return storeRepository.findById(storeId);
}
//... others methods
}
但如果我已经包含了注释@EnableWebSocketMessageBroker
,那么缓存不起作用,因为aop拦截器不使用它,所以
如果我没有包含 ,那么缓存和AOP拦截器运行良好。@EnableWebSocketMessageBroker
websocket上的文档我发现了这个信息:
在某些情况下,控制器可能需要使用AOP代理进行修饰 在运行时。一个例子是如果你选择
@Transactional
直接在控制器上的注释。在这种情况下,为 特别是控制器,我们建议使用基于类的代理。 这通常是控制器的默认选择。但是,如果一个 controller必须实现一个不是Spring Context的接口 您可能需要回调(例如InitializingBean
,* Aware等) 显式配置基于类的代理。例如用<tx:annotation-driven />
,更改为<tx:annotation-driven proxy-target-class="true" />
我尝试使用@EnableCaching(proxyTargetClass = true)
,但没有帮助。
有没有人遇到过这个问题?
答案 0 :(得分:1)
我决定了这个问题: 我在@EnableAsync(mode = AdviceMode.ASPECTJ)中更改了模式并且它可以工作。 我认为这取决于订单初始化BeanPostProcessors