You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:37:05