gpt4 book ai didi

java - 在 Cacheable 方法类中调用 Spring Cacheable 方法抛出异常

转载 作者:行者123 更新时间:2023-11-30 05:52:34 27 4
gpt4 key购买 nike

我正在尝试使用 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$Data无法转换为java.lang.String,这发生在String e行。我们知道为什么吗?

最佳答案

您声明了 2 个具有相同参数但返回类型不同的方法。:

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

并且您将它们都标记为 @Cacheable 并具有相同的缓存名称 CACHE。因此,您共享单个缓存来存储这两种方法的结果。两种方法具有完全相同的参数(String),因此 spring 为 DataValue 计算的缓存键将会发生冲突。

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

这与您执行此操作几乎相同:

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

关于java - 在 Cacheable 方法类中调用 Spring Cacheable 方法抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53650027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com