如何将Cache映射为DTO对象列表?解决ModelMapper实例化报错问题
问题分析与解决方案
错误根源
你犯了两个核心错误:
- 错误操作缓存容器而非缓存值:
CacheManager.getCache("MyList")获取的是缓存容器对象,不是你缓存的List<MyObjectDTO>数据,直接用ModelMapper映射Cache对象到List类型完全不符合逻辑。 - 对Spring Cache存储逻辑理解有误:
@Cacheable注解会把方法返回的List<MyObjectDTO>直接存入缓存,不需要额外的ModelMapper转换,缓存里的就是目标类型实例。
修正后的代码
ClassB 修改版
public List<MyObjectDTO> getCachedList(){ Cache cache = CacheManager.getCache("MyList"); if (cache == null) { // 缓存不存在则初始化 setCachedList(); cache = CacheManager.getCache("MyList"); } // 获取缓存中的实际值:因为setCachedList无参数,默认key是SimpleKey.EMPTY Cache.ValueWrapper valueWrapper = cache.get(SimpleKey.EMPTY); if (valueWrapper != null) { // 直接强转即可,缓存中存储的就是List<MyObjectDTO> return (List<MyObjectDTO>) valueWrapper.get(); } // 兜底返回空列表或重新初始化 return setCachedList(); }
额外说明
- 不需要用
TypeToken和 ModelMapper 做转换,Spring Cache会自动保留方法返回值的类型信息(默认的ConcurrentMapCache等常规缓存实现均支持)。 - 检查缓存是否存在时,直接判断
cache == null更可靠,CacheManager.getCacheNames()可能存在配置同步延迟问题。 - 如果使用Redis等分布式缓存,需确保配置了支持泛型的序列化器(比如Jackson2JsonRedisSerializer),避免类型信息丢失导致强转失败。
内容的提问来源于stack exchange,提问作者R.I
相关产品推荐
相关产品推荐

