在Spring Boot 3中如何配置GenericJackson2JsonRedisSerializer?

云婷酱_7926

云婷酱_7926

2026-11-12

838人浏览

原创

Spring Boot 3中GenericJackson2JsonRedisSerializer不自动生效,因默认RedisTemplate仍用JdkSerializationRedisSerializer;必须显式配置key/value序列化器,否则存入为乱码二进制,取值返回LinkedHashMap而非原类型。

在spring boot 3中如何配置genericjackson2jsonredisserializer?

Spring Boot 3 中直接使用 GenericJackson2JsonRedisSerializer 是可行的,但必须显式配置,否则它不会自动生效;默认的 RedisTemplate 仍会 fallback 到 JdkSerializationRedisSerializer,导致乱码、类型丢失或反序列化失败。

为什么 GenericJackson2JsonRedisSerializer 在 Spring Boot 3 中不自动生效

Spring Boot 3 默认只对 StringRedisTemplate 配置了 StringRedisSerializer,而泛型版的 RedisTemplate 依然使用 JDK 序列化器 —— 这是历史兼容性设计,不是 bug。如果你没手动覆盖 valueSerializer 和 keySerializer,哪怕引入了 Jackson 依赖,存进去的对象也会变成不可读的二进制字节流。

  • GenericJackson2JsonRedisSerializer 不带类型信息,反序列化时默认还原为 LinkedHashMap
  • 它不处理 LocalDateTime、BigDecimal 等非标准类型,需额外注册模块
  • 它和 Jackson2JsonRedisSerializer 的关键区别在于:前者支持泛型擦除后的反序列化(靠写入时记录类名),后者必须在构造时指定具体类型

如何正确配置 GenericJackson2JsonRedisSerializer

你需要在配置类中显式创建 RedisTemplate 实例,并设置其 valueSerializer 为 GenericJackson2JsonRedisSerializer,同时确保 key 使用 StringRedisSerializer(避免 key 也变乱码)。

  • 必须调用 setKeySerializer(new StringRedisSerializer()),否则 key 也会被 JSON 序列化,导致 scan 失效或命令报错
  • 建议搭配 ObjectMapper 注册 JavaTimeModule,否则 LocalDateTime 会抛 JsonMappingException
  • 不要复用同一个 ObjectMapper 实例给多个序列化器,避免线程安全问题或配置污染
@Bean
public RedisTemplate<string object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<string object> template = new RedisTemplate();
    template.setConnectionFactory(connectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    ((GenericJackson2JsonRedisSerializer) template.getValueSerializer()).setObjectMapper(mapper);

    template.afterPropertiesSet();
    return template;
}</string></string>

容易踩的坑:反序列化时 ClassCastException 或 null 值

最常见现象是取值后得到 LinkedHashMap 而不是你期望的 User 类型,或者反序列化直接返回 null —— 这通常不是配置遗漏,而是使用方式不对。

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
  • 用 redisTemplate.opsForValue().get("key") 取出的是 Object,必须显式强转,且仅当存入时用了 GenericJackson2JsonRedisSerializer 才能保类型
  • 如果存入用的是 stringRedisTemplate,取出时却用 redisTemplate,会因序列化器不匹配导致解析失败
  • GenericJackson2JsonRedisSerializer 内部写入 JSON 时会加一个 @class 字段(如 {"@class":"com.example.User","name":"Alice"}),若原始 JSON 来自外部(如 HTTP 请求体),缺少该字段就无法还原类型

替代方案:什么时候该换用 Jackson2JsonRedisSerializer

如果你的操作对象类型固定、已知(比如缓存都是 User 或 Order),Jackson2JsonRedisSerializer 比 GenericJackson2JsonRedisSerializer 更轻量、更安全,也不依赖 @class 字段。

  • Jackson2JsonRedisSerializer 构造时指定类型,反序列化严格按该类型执行,无运行时类型推断开销
  • 它不写 @class 字段,JSON 更干净,适合与前端或其他语言系统交互
  • 但无法用于泛型容器(如 List),除非你手动包装成 wrapper 类

真正复杂的地方不在怎么配,而在于你是否清楚:这个序列化器决定的是「谁来解释 value 字节流」——一旦选错,Redis 里存的数据就再也无法按预期还原。别依赖 IDE 控制台显示“看着像 JSON”就认为成功了,务必用 redis-cli + get key 直接验证原始内容。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis js json spring boot

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2951

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

517

25

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4956

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1435

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1918

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

10483

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

1060

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3144

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1669

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习