是否可以在春季默认使用自定义序列化器/反序列化器?

Posted

技术标签:

【中文标题】是否可以在春季默认使用自定义序列化器/反序列化器?【英文标题】:Is it possible to use a custom serializer/deserializer for a type by default in spring? 【发布时间】:2021-02-06 20:01:12 【问题描述】:

我有一个来自第三方库的类型(JSONB 来自 jooq),我为它编写了一个自定义序列化器/反序列化器:

@JsonComponent
public class JSONBSerializer extends JsonSerializer<JSONB> 
    @Override
    public void serialize(JSONB jsonb, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException 
        jsonGenerator.writeString(jsonb.toString());
    

@JsonComponent
public class JSONBDeserializer extends JsonDeserializer<JSONB> 
    @Override
    public JSONB deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException 
        return JSONB.valueOf(jsonParser.getValueAsString());
    

我想知道是否有办法告诉 spring 或 jackson 默认使用这些,而不必用 @JsonSerialize(using = JSONBSerializer.class)@JsonDeserialize(using = JSONBDeserializer.class) 注释项目中的每个 JSONB 字段?

【问题讨论】:

【参考方案1】:

您需要创建新的com.fasterxml.jackson.databind.module.SimpleModule 实例并注册所有自定义序列化器和反序列化器。接下来,您需要查看如何在您的Spring Boot 版本中注册新的自定义模块。

@Bean
public SimpleModule jooqModule() 
    SimpleModule jooqModule = new SimpleModule();
    jooqModule.addSerializer(JSONB.class, new JSONBSerializer());
    jooqModule.addDeserializer(JSONB.class, new JSONBDeserializer());

看看:

How can I register and use the jackson AfterburnerModule in Spring Boot? Jackson global settings to deserialise array to custom list implementation Jackson custom serialization and deserialization In Spring Boot, adding a custom converter by extending MappingJackson2HttpMessageConverter seems to overwrite the existing converter Customizing HttpMessageConverters with Spring Boot and Spring MVC

【讨论】:

以上是关于是否可以在春季默认使用自定义序列化器/反序列化器?的主要内容,如果未能解决你的问题,请参考以下文章

编写半自定义反序列化器

在其他反序列化器中调用自定义 Jackson 反序列化器

flume自定义反序列化器deserializer

Spring @RestController 自定义 JSON 反序列化器

Spring boot 动态/注解自定义 JSON 反序列化器

Spring Boot:使用自定义序列化器 + 反序列化器消费和生成 XML