使用CompositeCodec时如何让RMap正确转换为Member类型对象?
问题解决:Redisson CompositeCodec 导致 RMap.get 返回 LinkedHashMap 而非目标类型
问题原因
使用CompositeCodec(StringCodec.INSTANCE, new TypedJsonJacksonCodec(Member.class))时,由于泛型类型擦除,Redisson无法将反序列化逻辑正确关联到Member类型,Jackson默认将JSON转成了LinkedHashMap,从而触发类型转换异常。而直接使用JsonJacksonCodec时,Redisson会自动传递RMap声明的泛型类型信息,因此能正常反序列化为Member对象。
可行解决方案
方案一:用JsonJacksonCodec指定类型引用替换TypedJsonJacksonCodec
修改CompositeCodec的初始化代码,使用带类型引用的JsonJacksonCodec作为valueCodec:
import com.fasterxml.jackson.core.type.TypeReference; import org.redisson.codec.JsonJacksonCodec; // ... static final CompositeCodec codec = new CompositeCodec( StringCodec.INSTANCE, new JsonJacksonCodec(new TypeReference<Member>() {}) );
这种方式直接明确了反序列化的目标类型,Jackson能精准将JSON转换为Member对象。
方案二:使用GenericJackson2JsonRedisCodec(支持多类型场景)
如果需要存储多种类型的对象,可以使用GenericJackson2JsonRedisCodec,它会在序列化时写入类型标识,反序列化时自动识别:
import org.redisson.codec.GenericJackson2JsonRedisCodec; // ... static final CompositeCodec codec = new CompositeCodec( StringCodec.INSTANCE, new GenericJackson2JsonRedisCodec() );
注意:该方案会在JSON数据中增加@class字段存储类型信息,适合多类型共存的场景。
方案三:调整TypedJsonJacksonCodec的初始化方式
使用TypeReference而非直接传入Class对象来创建TypedJsonJacksonCodec:
import com.fasterxml.jackson.core.type.TypeReference; // ... static final CompositeCodec codec = new CompositeCodec( StringCodec.INSTANCE, new TypedJsonJacksonCodec(new TypeReference<Member>() {}) );
通过TypeReference明确指定泛型类型,避免类型擦除导致的反序列化错误。
验证
修改后重新运行代码,map.get(name)会正确返回Member类型对象,不会再抛出类型转换异常。
内容的提问来源于stack exchange,提问作者xuleilei
相关产品推荐
相关产品推荐

