java
/**
* 获取所有活跃的自定义字段(缓存 DTO)
* 缓存 DTO 而非实体类,避免序列化关联对象(Space、CustomChoice)
*/
@Cacheable(cacheResolver = "tenantDynamicCacheResolver",
cacheNames = {"system:customField:"},
key = "'customField'")
public List<CustomFieldCacheDto> getAllActiveCustomFieldListInCache() {
List<CustomField> entities = customFieldRepository.findAllDataAsEntity();
return entities.stream()
.map(CustomFieldConvert.INSTANCE::convertToCacheDto)
.toList();
}
二次读取会报错,
java
List<CustomFieldCacheDto> fieldList = service.getAllActiveCustomFieldListInCache();
将 toList() 替换为.collect(Collectors.toList()); 正常。
根本原因
1. 返回的 List 实现类不同
java
// toList() - Java 16+ 引入
.stream().toList()
// 返回: ImmutableCollections.ListN (不可变列表)
// Collectors.toList()
.stream().collect(Collectors.toList())
// 返回: ArrayList (可变列表)
2. 序列化器无法处理不可变列表
Redisson/Jackson 在反序列化时:
-
ArrayList:有默认无参构造器,可以正常实例化
-
ImmutableCollections.ListN:没有公共构造器,无法通过反射创建实例