Java 从依赖jar使用Spring CacheManager

Java 从依赖jar使用Spring CacheManager,java,spring,caching,jar,redis,Java,Spring,Caching,Jar,Redis,我有几个WAR项目,其中包括对某个实用程序JAR项目的依赖关系。我希望能够使用spring的@Cacheable注释来缓存实用程序项目中的某些方法,因此我尝试在实用程序项目上创建一个配置文件,在该文件中我可以定义一个CacheManager bean来处理方法的缓存。配置文件如下所示: (注意,我使用的是Redis缓存实现,但是其他缓存提供程序的spring配置应该非常类似) 项目B是另一个WAR,它有自己的CacheManager(不与UTIL绑定),并使用@Cacheable缓存类似的方法。

我有几个WAR项目,其中包括对某个实用程序JAR项目的依赖关系。我希望能够使用spring的@Cacheable注释来缓存实用程序项目中的某些方法,因此我尝试在实用程序项目上创建一个配置文件,在该文件中我可以定义一个CacheManager bean来处理方法的缓存。配置文件如下所示:

(注意,我使用的是Redis缓存实现,但是其他缓存提供程序的spring配置应该非常类似)

项目B是另一个WAR,它有自己的CacheManager(不与UTIL绑定),并使用@Cacheable缓存类似的方法。如果我点击项目A的methodA,则项目B中的缓存将正确存储,但项目A中的cachedMethod不会在缓存中存储任何内容(使用@Cacheable注释的utils项目中的方法也不会)。我也尝试了另一种方法,直接在项目A上创建CacheManager,但它也无法在utils项目内缓存带注释的方法(我更喜欢在utils项目上声明管理器,以便其他模块可以重用它)

我知道Spring正确地初始化了utils项目中的bean,因为如果项目A的上下文属性占位符没有从缓存配置文件中找到@Value注释的属性文件,那么项目A将无法运行。所以我假设cachemanagerbean在那里,但不知为什么它不起作用。关于我做错了什么,或者是否可以从依赖JAR使用CacheManager(如果可能,使用Java配置),有什么想法吗?我正在使用Spring3.2.0.RELEASE


几天来,我们一直在努力解决这个问题,因此非常感谢您的帮助。

结果是spring cache抽象的默认代理模式存在问题。缓存注释不起作用的所有方法都被同一对象中的其他方法调用。我可以在CacheManager bean上使用@Autowire并手动执行缓存操作,正确地操作依赖jar项目中的缓存。虽然可以通过启用AspectJ编织模式来使用注释,但我不想因为必须处理依赖模块中的编织而增加复杂性。

我遇到了类似的问题,将缓存方法移出同一对象正是需要的。感谢您的跟进,因为我完全忘记了spring代理行为,这使我免于任何进一步的挫折。是的,将@Cacheable方法移到调用方法类之外并进行自动连接是有效的。但这是一种好的方式吗?
@Configuration
@EnableCaching
public class RedisConfig {

    @Value("${redis.hostUrl}")
    private String hostUrl = null;

    @Value("${redis.port}")
    private Integer port = null;

    @Value("${redis.defaultExpiration}")
    private Integer defaultExpiration = null;


    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory = new JedisConnectionFactory();
        // Defaults
        redisConnectionFactory.setHostName(hostUrl);
        redisConnectionFactory.setPort(port);
        return redisConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory cf) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(cf);
        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);

        // Number of seconds before expiration. Defaults to unlimited (0)
        cacheManager.setDefaultExpiration(defaultExpiration);

        cacheManager.setUsePrefix(true);

        List<String> cacheNames = new ArrayList<String>();
        cacheNames.add("testing");
        cacheManager.setCacheNames(cacheNames);
        return cacheManager;
    }
}
@RequestMapping(...)
@ResponseBody
public Dto methodA(...) {

    //The relevant part
    testCachedMethod(value);
    cachedMethodFromProjectB(value);

}

@Cacheable(value="testing")
public String testCachedMethod(String value) {
    return value;
}