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

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字段,反序列化时也能通过该字段找到对应的类。

自定义对象序列化/反序列化的更优方案

  1. 优先使用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
  1. 按需开启类型序列化,减少冗余
    全局开启类型序列化会增加JSON数据体积,建议只在需要缓存的实体类上添加@JsonTypeInfo注解,避免不必要的开销。

  2. 尝试KryoCodec提升性能
    如果对序列化速度和数据体积有较高要求,Redisson的KryoCodec是更优选择——它的序列化速度比Jackson快数倍,生成的数据体积更小,且无需手动处理类型ID。配置示例:

codec: !<org.redisson.codec.KryoCodec> {}
  1. Spring环境下统一序列化策略
    如果项目同时使用Spring Data Redis,可以配置RedisTemplate使用Jackson2JsonRedisSerializer,配合Redisson的缓存配置,实现全项目统一的序列化规则,避免多组件之间的序列化冲突。

内容的提问来源于stack exchange,提问作者QuangBui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:56:06