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

在可缓存方法类强制转换异常中调用Spring可缓存方法

岳城
2023-03-14

我正在尝试使用Spring Cacheable,但我得到一个类强制转换异常

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CacheableTest.class, loader = AnnotationConfigContextLoader.class)
@Configuration
@EnableCaching
public class CacheableTest {
    public static final String CACHE = "cache";

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager(CACHE);
    }

    @Autowired
    DataService service;

    @Test
    public void cacheTest() {
        final String name = "name";
        Data a = service.getData(name);
        Data b = service.getData(new String(name));
        Assert.assertSame(a, b);
        String c = service.getValue(service.getData(name));
        String d = service.getValue(service.getData(new String(name)));
        Assert.assertSame(c, d);
        String e = service.getValue(name);
        String f = service.getValue(new String(name));
        Assert.assertSame(e, f);
    }

    public static class Data {
        private String value;
        public Data(String value) {
            this.value = value;
        }
    }

    @Service
    public static class DataService {
        @Resource
        private DataService self;

        @Cacheable(CACHE)
        public Data getData(String name) {
            return new Data(name);
        }

        @Cacheable(CACHE)
        public String getValue(Data data) {
            return data.value;
        }

        @Cacheable(CACHE)
        public String getValue(String name) {
            return self.getData(name).value;
        }
    }

}

例外情况是,CacheableTest$数据不能转换为java。lang.String发生在字符串e行。我们知道为什么吗?


共有1个答案

申炳
2023-03-14

您已声明了两个参数相同但返回类型不同的方法:

public Data getData(String name)
public String getValue(String name) 

您用相同的缓存名称将它们标记为可缓存。因此,您共享单个缓存来存储两种方法的结果。这两种方法具有完全相同的参数(字符串),因此spring为数据和值计算的缓存键将发生冲突。

调用的第一个方法将返回Spring将放入缓存的结果,第二个方法将尝试从缓存中检索相同的结果(因为缓存名称和方法参数匹配)并尝试将其转换为其他类型-因此,类转换异常。

这和你做的差不多:

Map<String, Object> cache = new HashMap<>();
cache.put("key", "value1");
int i = (Integer)cache.get("key")

 类似资料:
  • 我正在使用注释来缓存我的方法的结果。出于性能原因,我想缓存从方法返回的和非null值。 但是这里的问题是Spring缓存非空值,但由于某种原因没有缓存空值。 这是我的密码: 我什么都试过了。就连我 但这也没什么帮助。有关于这个的指示吗?

  • 我试图以某种方式“调试”使用spring boot cache注释的应用程序,为此,我想知道如何找到实际实现接口Cacheable、CacheConfig等的类。 我的想法是确认缓存正在被填充、清空等。

  • 我正在尝试实现Spring boot cacheable。我想缓存作为ws调用的方法响应。 1) 我能够根据请求实现缓存。 2) 我计划每天凌晨1点后进行缓存逐出。 这也很正常。我的问题是,在没有从浏览器向@Cacheable注释方法发出任何请求的情况下,我可以在驱逐后调用@Cacheable注释方法以确保应用程序安全吗? 这是为了应用安全。如果@Cacehable无法缓存响应,则不会影响应用程序

  • 我在Spring3.1中使用@Cacheable。我对Cacheable中的值和键映射参数有点混淆。以下是我正在做的: 这里发生的情况是,第二个方法依赖于第一个方法的选定值,但问题是假设当我传递zoneMastNo=1和areaMastNo=1时,第二个方法返回第一个方法结果。事实上,我有很多服务,因此,我希望使用公共值来缓存特定的用例。现在我的问题是: 我如何解决这个问题 对每个服务都使用cac

  • 本文向大家介绍CodeIgniter启用缓存和清除缓存的方法,包括了CodeIgniter启用缓存和清除缓存的方法的使用技巧和注意事项,需要的朋友参考一下 Codeigniter支持缓存技术,以达到最快的速度。尽管CI已经相当高效了,但是网页中的动态内容、主机的内存CPU和数据库读取速度等因素直接影响了网页的加载速度。依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保

  • 我最近开始缓存一个方法的结果。我使用@Cacheable和@CachePut来实现所需的功能。 但不知何故,save操作并没有更新findAll方法的缓存。以下是相同的代码段: 对于findAll方法的第一个调用,它将结果存储在“persons”缓存中,对于所有后续调用,它将返回相同的结果,即使在两者之间执行了save()操作。 我对缓存很陌生,所以任何关于这方面的建议都会很有帮助。 谢谢