Redisson中JsonJacksonCodec序列化自定义对象异常的解决方法
解决Redisson JsonJacksonCodec 缺少类型ID '@class' 的异常
问题原因
使用JsonJacksonCodec序列化自定义实体(如Cat类)到Redis时,Jackson默认不会序列化对象的类型信息,而Redisson反序列化时需要@class字段来确定实例化的目标类,因此抛出InvalidTypeIdException。
解决方案
方案1:全局配置JsonJacksonCodec,开启类型序列化
修改redisson-config.yaml,为JsonJacksonCodec配置带类型序列化的ObjectMapper:
singleServerConfig: address: "redis://127.0.0.1:6379" password: null connectionMinimumIdleSize: 10 connectionPoolSize: 64 idleConnectionTimeout: 10000 connectTimeout: 10000 timeout: 3000 retryAttempts: 3 retryInterval: 1500 threads: 16 nettyThreads: 32 codec: !<org.redisson.codec.JsonJacksonCodec> objectMapper: !<com.fasterxml.jackson.databind.ObjectMapper> enableDefaultTyping: !<com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping> NON_FINAL transportMode: "NIO"
NON_FINAL参数会让Jackson为所有非final类自动添加@class字段,包含类的全限定名,Redisson反序列化时就能正确识别类型。
方案2:在实体类上添加Jackson注解,局部指定类型信息
如果不想全局开启类型序列化,可以直接在Cat类上添加Jackson注解,强制生成类型ID:
@Entity @org.hibernate.annotations.Cache(region = "hibernate_2nd_cat_cache", usage = CacheConcurrencyStrategy.READ_WRITE) @Table(name = "cat") @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") public class Cat implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; public Cat() { } // getter、setter省略 }
这个注解会让Jackson序列化Cat实例时自动添加@class字段,反序列化时也能通过该字段找到对应的类。
自定义对象序列化/反序列化的更优方案
- 优先使用Jackson2JsonCodec替代JsonJacksonCodec
Redisson官方推荐用Jackson2JsonCodec(同属org.redisson.codec包),它是JsonJacksonCodec的改进版,配置更灵活,默认对类型信息的支持更友好。配置示例:
codec: !<org.redisson.codec.Jackson2JsonCodec> objectMapper: !<com.fasterxml.jackson.databind.ObjectMapper> enableDefaultTyping: !<com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping> NON_FINAL
按需开启类型序列化,减少冗余
全局开启类型序列化会增加JSON数据体积,建议只在需要缓存的实体类上添加@JsonTypeInfo注解,避免不必要的开销。尝试KryoCodec提升性能
如果对序列化速度和数据体积有较高要求,Redisson的KryoCodec是更优选择——它的序列化速度比Jackson快数倍,生成的数据体积更小,且无需手动处理类型ID。配置示例:
codec: !<org.redisson.codec.KryoCodec> {}
- Spring环境下统一序列化策略
如果项目同时使用Spring Data Redis,可以配置RedisTemplate使用Jackson2JsonRedisSerializer,配合Redisson的缓存配置,实现全项目统一的序列化规则,避免多组件之间的序列化冲突。
内容的提问来源于stack exchange,提问作者QuangBui
相关产品推荐
相关产品推荐

