我正面临一个问题,代码试图找到名为"AdministrationContactManagerImpl.retrieve“的缓存,但找不到用@ it.The注释的缓存目标方法。
@Cacheable(value="administrationContactManagerImpl.retrieve", key="#prefix + #contract + #effectiveDate + #administrationRoles")
public List<AdministrationContact> retrieve(Set<AdministrationRole> administrationRoles, Date effectiveDate,我没有在我的主applicationContext中定义<ehcache:annotation-driven> file.This意味着不应该启用缓存,并且我不应该在堆栈跟踪中遇到错误输出。我怀疑类路径中的一些jar可能正在启用缓存,但是它是如何启用的,我如何检测它呢?
谁能告诉我如何禁用缓存,以避免此错误。
我们使用的是spring版本3.1.1,version。
java.lang.IllegalArgumentException: Cannot find cache named [administrationContactManagerImpl.retrieve] for CacheableOperation[public java.util.List com.principal.ris.contact.internal.impl.AdministrationContactManagerImpl.retrieve(java.util.Set,java.util.Date,java.lang.Integer,java.lang.String)] caches=[administrationContactManagerImpl.retrieve] | condition='' | key='#prefix + #contract + #effectiveDate + #administrationRoles'
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.cache.interceptor.CacheAspectSupport.getCaches(CacheAspectSupport.java:163)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.cache.interceptor.CacheAspectSupport$CacheOperationContext.<init>(CacheAspectSupport.java:443)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.cache.interceptor.CacheAspectSupport.getOperationContext(CacheAspectSupport.java:173)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.cache.interceptor.CacheAspectSupport.createOperationContext(CacheAspectSupport.java:404)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:192)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at com.principal.ris.contact.internal.impl.AdministrationContactManagerImpl$$EnhancerByCGLIB$$ddaad355.retrieve(<generated>)
[4/17/13 14:44:50:001 IST] 0000001a SystemErr R at com.principal.ris.tpaview.listener.TpaViewUserTemplateListener.contextCreated(TpaViewUserTemplateListener.java:118)更新这篇文章:我已经选择了答案作为最佳答案,但我会告诉你我做了什么。在你的java maven项目中,你真的不需要包含这样的注解,因为它们会影响你的上下文。作为最佳实践,请始终将交换机配置保存在war的pom文件中。
发布于 2013-04-17 21:42:38
参考文档的This section详细介绍了如何在Spring中启用对缓存注释的支持。在此基础上,您的某个<cache:annotation-driven/>上下文文件中必须有一个xml标记。请仔细检查是否没有(可能是可传递的)包含此指令的导入配置文件。
回复您的评论:
在导入的xml文件中包含<cache:annotation-driven/>肯定会启用缓存支持。所有导入的(和传递导入的)上下文文件被合并到一个单独的Spring上下文中,annotation-driven标记指示Spring在整个上下文中查找bean的注释,而不仅仅是在放置此指令的同一个xml文件中定义的bean上查找批注。需要理解的重要一点是,bean定义可能在物理上被分成几个文件(也可以来自不同的jars),但这不会导致上下文的任何类型的逻辑模块化。
这种模块化只能通过定义上下文之间的父子关系来实现,其中首先加载父上下文,然后加载第二个子上下文(将第一个指定为其父)。这导致了这样一种设置:父上下文基本上不知道它的子上下文,但是子上下文可以访问在其父上下文中定义的任何bean。
您可以使用它首先加载外部jar中定义的上下文,然后将您自己的上下文作为子上下文加载。这样,父上下文中的annotation-driven不会影响bean,而您仍然可以访问parent上下文中的任何内容。
问题是,如果您的应用程序是Spring MVC webapp,则没有简单的方法来声明父上下文。
https://stackoverflow.com/questions/16059233
复制相似问题