当前位置: 首页 > 知识库问答 >
问题:

使用从属jar中的Spring CacheManager

通啸
2023-03-14

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

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

@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;
    }
}

我很确定配置本身不是问题,因为我在其他WAR模块中有类似的配置文件,缓存在这些模块上运行良好。然而,由于这是一个由其他模块加载的JAR,我猜CacheManager不会被Spring调用。

在依赖于utils项目的项目A中,我有一个类似于以下的方法(为简单起见进行了编辑;忽略无效语法):

@RequestMapping(...)
@ResponseBody
public Dto methodA(...) {

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

}

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

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

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

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

共有1个答案

壤驷鸿
2023-03-14

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

 类似资料:
  • service类有一个方法可以进行查询,从Application.properties文件中填充了属性的成员变量中获取查询字符串: 第二个SpringBoot应用程序是一个具有REST控制器的Web应用程序。这些控制器公开调用CaseInvocationAPI库(特别是CaseInvocationService类)的endpoint。 我遇到的问题是,当SpringBoot WEBAPPLICAT

  • 我正在尝试创建一个jar文件,其中包含所有的依赖jar文件。Maven创建了一个单独的lib文件夹,并将所有的jar复制到其中,然后可执行jar就会工作,因为jar和lib位于同一位置,但我希望jar是主jar的一部分,而不是在lib文件夹中。我该怎么做?

  • 当我使用 在intelij运行期间,一切正常。 在jar的案例中,我尝试了: 等等。它们导致正确的路径,例如: > 文件:/D:/Projects/myProject/target/classes/static/assets/config/fileName(对于toExternalForm) /D: /Projects/myProject/target/classes/static/assets/

  • 问题内容: 我有一个Spring Boot应用程序(Y),它依赖于一组打包为x.jar并在应用程序Y的pom.xml中作为依赖项提及的库文件。 x.jar有一个名为(User.java)的bean。应用程序Y有一个名为(Department.java)的java类。 当我尝试在Department.java中自动装配User.java实例时,出现以下错误 我不能@Autowire从属库Jar中存在

  • 在阅读了关于这个主题的大约50个不同的线程后,我还没有能够有任何解决方案工作。 我正在尝试访问JAR中的config.properties文件。 null null file.jar MyApp 此处的files.class 等… icon.jpg config.properties

  • 问题内容: Weblogic 10.3.1.0正在使用com.bea.core.apache.commons.net_1.0.0.0_1-4-1.jar …我想从我的代码中使用commons-net-2.0.jar。 如何强制它仅在我的代码中使用较新的JAR? 问题答案: 我想从我的代码中使用commons-net-2.0.jar。 WebLogic使用 父类加载器优先策略 ,您基本上可以通过两种