gpt4 book ai didi

Spring在一个Service bean中进行多缓存

转载 作者:行者123 更新时间:2023-12-03 00:30:36 25 4
gpt4 key购买 nike

我使用的是 spring-4.3。

@Cacheable("productCategories")
@Override
public ProductCategory get(Object id) throws BeanNotFoundException {
return super.get(id);
}

@Cacheable("productCategoryChildren")
public List<ProductCategory> getChildren(String parentId) {
return productCategoryDao.getChildren(parentId);
}

首先,我调用 get("100") 并返回一个实体,然后调用 getChildren("100"),我收到错误 java. lang.ClassCastException:com.jxs.ms.entity.ProductCategory 无法转换为 java.util.List。这两种方法是否使用相同的缓存来存储值?

最佳答案

我遇到了类似的问题,但就我而言,我们将 spring 与 memcached 一起使用。我们的问题是 CacheConfiguration 将 useNameAsKeyPrefix 属性默认为 false。

要理解的关键是两个命名缓存的底层缓存使用相同的映射。在这种情况下idparentId最终可能是相同的缓存键。尽管缓存在 spring 缓存抽象中的命名不同,但底层缓存管理器将它们全部存储在同一个位置。所以第一个请求是get("1234")ProductCategory 填充缓存对于给定的 id“1234”。那么当 getChildren("1234")被调用时,缓存管理器会进行查找,忽略缓存名称并仅查找键“1234”,它找到并返回 ProductCategory 。因为 spring 代理 bean 期待 List<ProductCategory> ,你最终得到 ClassCastException .

像这样更新配置,解决了我的问题:

<bean id="defaultMemCacheConfiguration" class="com.google.code.ssm.providers.CacheConfiguration">
...
<property name="useNameAsKeyPrefix" value="true"/>
</bean>

关于Spring在一个Service bean中进行多缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034868/

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