@Cachable注释不起作用

时间:2013-04-10 11:43:10

标签: java spring ehcache spring-annotations

我们在项目中使用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
    }
}

进入方法时,没有缓存拦截器。到目前为止我们检查过的事情:

  1. 我们不会在课堂内调用此方法,而是从外部调用。所以问题不在于导致绕过代理的内部调用。
  2. 我们为这个类添加了一个接口,我们更改了调用此类的注入,以使用接口表示而不是具体类。
  3. 我们已经以这种方式在我们的应用程序上下文中定义了缓存管理器:

       <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)。如果确实如此,将会更新。

4 个答案:

答案 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()方法。

我不确定此框架是否将基元转换为其包装变体(例如IntegerBoolean)。尝试返回包装变体Boolean而不是原始类型,看它是否有效。

我不确定的另一件事是它如何(以及如果)处理final参数。如果我的第一个想法不起作用,请尽可能删除final关键字,看看它是否有效。