【Spring】定制GenericJackson2JsonRedisSerializer的mapper

0.前言

在使用Spring Boot Cache的时候,我们会自定义序列化方式,而spring boot cache提供了一个
GenericJackson2JsonRedisSerializer让我们使用

这个类默认内部的ObjectMapper 有一些他自定义的配置.如果贸然更改,容易造成序列化和反序列化的错误.

但是在存储Java8提供的新的时间类的时候,会报错,因为他内部的ObjectMapper并没有注册jsr310提供的时间模块.

同时,它也没提供类似 GenericJackson2JsonRedisSerializer.getObjectMapper的方法

但是提供了其他方式的获取到它内部的ObjectMapper的一个方法

这个它配置好的mapper可以序列化泛型,配置起来实在是麻烦,所以最好就直接用它配置好的,如果有定制内容,
直接想办法去修改它配置好的mapper,而不是说自定new一个mapper进行替换.

1.对应源码

源码中有这样的一个方法,可以让我们获取到它内部的ObjectMapper

用来对它进行扩展定制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* Builder method used to configure and customize the internal Jackson {@link ObjectMapper} created by
* this {@link GenericJackson2JsonRedisSerializer} and used to de/serialize {@link Object objects}
* as {@literal JSON}.
*
* @param objectMapperConfigurer {@link Consumer} used to configure and customize the internal {@link ObjectMapper};
* must not be {@literal null}.
* @return this {@link GenericJackson2JsonRedisSerializer}.
* @throws IllegalArgumentException if the {@link Consumer} used to configure and customize
* the internal {@link ObjectMapper} is {@literal null}.
*/
public GenericJackson2JsonRedisSerializer configure(Consumer<ObjectMapper> objectMapperConfigurer) {

Assert.notNull(objectMapperConfigurer,
"Consumer used to configure and customize ObjectMapper must not be null");

objectMapperConfigurer.accept(getObjectMapper());

return this;
}
JAVA

2.解决时间序列化提示jsr310

java:

1
2
3
4
var serializer = new GenericJackson2JsonRedisSerializer();
serializer.configure(om -> {
om.registerModule(new JavaTimeModule());
});
JAVA

kotlin:

1
2
3
4
val serializer = GenericJackson2JsonRedisSerializer()
serializer.configure {
it.registerModule(JavaTimeModule())
}
KOTLIN

【Spring】定制GenericJackson2JsonRedisSerializer的mapper
https://www.yangxj96.com/Spring/SpringCustomGenericJackson2JsonRedisSerializerMapper/
作者
道一
发布于
2023年11月16日
许可协议