一、Redis存储的数据内容

{ "@class": "com.xxx.xxx", "age": 1, "name": "xxxxx"}

Redis缓存中存储的xxxx对象包含了@class属性,这是Jackson序列化Java对象时的类型信息。以下是原因分析和解决方案:


问题原因


Jackson序列化机制:当使用Jackson将Java对象序列化为JSON字符串存储到Redis时,默认会包含@class字段来记录对象的实际类型,以便反序列化时能够正确还原对象类型。
Redisson配置:Redisson在存储对象时使用了Jackson的序列化机制,会自动添加类型信息以确保反序列化的准确性。


二、解决方案


方案一:配置ObjectMapper不包含类型信息

// 在RedissonClientTemplate或相关配置类中添加
@Resource
private ObjectMapper objectMapper;

// 配置ObjectMapper不自动包含类型信息
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

方案二:使用String序列化方式存储

// 修改存储方式,手动控制序列化
String jsonValue = objectMapper.writeValueAsString(xxxx);
batch.getBucket(RedisKeyConstants.xxxxx+ xxx.getName())
     .setAsync(jsonValue);

方案三:在实体类上添加注解控制序列化


@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
public class xxxx {
    // ... existing code
}

推荐做法


建议采用方案一或方案三,这样既保持了类型安全,又避免了JSON中出现不必要的@class字段。如果需要保持向后兼容性,可以考虑在读取时忽略该字段:

// 在添加注解
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class xxxx {
    // ... existing code
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐