Spring Boot使用ECache时是否需要指定key-type与value-type参数?
问题解答
key-type与value-type的作用
- 强类型校验:这两个参数是Ehcache提供的类型约束配置,开启后Ehcache会在缓存写入、读取阶段自动校验key、value的实际类型是否和配置的类型匹配,避免非法类型数据存入缓存导致后续业务逻辑出现隐式类型转换错误。
- 提升可维护性:明确标注缓存的key、value类型后,维护人员可以直接通过缓存配置了解该缓存的存储规则,不需要逐行梳理业务代码定位缓存使用逻辑。
- 小幅性能优化:明确类型后Ehcache可以跳过通用类型序列化/反序列化过程中的额外类型判断逻辑,在高并发缓存读写场景下有可忽略的小幅性能提升。
异常触发原因
你配置的dishDTOs缓存value-type固定为com.topjava.graduation.restaurant.dto.DishResponseDTO,但你在业务代码中给同一个缓存存入了两种完全不同类型的value:
- 调用
getAll()方法时,存入缓存的value是List<DishResponseDTO>类型(实际是java.util.ArrayList实例),和配置的单个DTO类型不匹配 - 调用
getOne()方法时,存入缓存的value是DishResponseDTO单个实例,和配置类型匹配
当类型校验开启时,只要有一次写入的value类型和配置不匹配,就会直接抛出你遇到的类型不匹配异常。如果你需要保留类型校验能力,建议将列表缓存和单个对象缓存拆分到两个不同的缓存实例中,不要共用同一个缓存名;如果不需要强类型校验,直接删除key-type和value-type配置即可正常运行。
内容的提问来源于stack exchange,提问作者user16613329
相关产品推荐
相关产品推荐

