我们在项目中使用ehcache进行缓存。
import com.googlecode.ehcache.annotations.Cacheable;
// Other imports
@Component
public class Authenticator{
@Cacheable(cacheName = "rest_client_authorized")
public boolean isUserAuthorized(final String user, final String sessionId) {
// Method code
}
}
进入方法时,没有缓存拦截器。到目前为止我们检查过的事情:
我们已经以这种方式在我们的应用程序上下文中定义了缓存管理器:
<ehcache:annotation-driven cache-manager="ehCacheManager" />
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<!-- use a share singleton CacheManager -->
<property name="shared" value="true" />
</bean>
缓存的定义如下:
<cache name="rest_client_authorized"
eternal="false"
maxElementsInMemory="50"
overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LRU" />
当我们使用Jconsole测试缓存管理器时,我们可以看到缓存* rest_auth_disabled *存在且为空。
任何有关为什么不起作用的想法都将非常感激。谢谢!
更新(来自以下评论的汇总):
========================================== **
这是一个遗留代码,可以很好地处理我提供的类和定义。我在这里谈论的方法是新的,但课程的其余部分确实在过去工作。所以我们正在努力去理解发生了什么变化。我们也尝试将注释替换为spring Cacheable,但仍然没有:/ 也许这取决于调用这个新方法的代码,该方法来自与我们用于其他方法的spring bean不同的Spring bean。但我仍然找不到问题。
还尝试在下面的答案后返回布尔值而不是布尔值,但它不起作用。 我们有一个新的领导,这可能与我们注入bean的方式有关(使用@Autowire)。如果确实如此,将会更新。
答案 0 :(得分:3)
此问题可能与订单弹簧加载bean有关。尝试从Authenticator声明中删除@Autowire注释,并手动执行自动装配。类似的东西:
/**
* Class that uses Authenticator
*/
public class X {
// Don't use @autowire here
public Authenticator athenticator;
public void doSomething() {
manuallyAutowire();
}
public void manuallyAutowire() {
if(authenticator == null) {
authenticator = ApplicationContextUtils.getApplicationContext().
getBean(authenticator.class);
}
}
其中
@Component
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext ctx;
@Override
public void setApplicationContext(final ApplicationContext appContext)
throws BeansException {
ctx = appContext;
}
public static ApplicationContext getApplicationContext() {
return ctx;
}
}
答案 1 :(得分:1)
@Cacheable中参数 cacheName 的值应与&lt; cache&gt; 声明的名称属性的值相同在您的应用程序上下文中
答案 2 :(得分:1)
我认为你在这里混淆了一些东西 - 你已经使用过com.googlecode.ehcache.annotations.Cacheable
,如果你想要Spring缓存支持它实际应该是org.springframework.cache.annotation.Cacheable
。然后缓存拦截器应该干净利落。
答案 3 :(得分:1)
据我所知,Spring Ehcache注释建议将两个参数作为返回对象应该有一个原始类型缺少的equals()
和hashCode()
方法。
我不确定此框架是否将基元转换为其包装变体(例如Integer
或Boolean
)。尝试返回包装变体Boolean
而不是原始类型,看它是否有效。
我不确定的另一件事是它如何(以及如果)处理final
参数。如果我的第一个想法不起作用,请尽可能删除final
关键字,看看它是否有效。