Immutables不可变类含Optional字段时Jackson序列化结果异常如何解决
解决方案
你遇到的问题由两个原因导致:Jackson默认未适配JDK Optional类型,会将其作为普通对象序列化出present字段;同时默认配置会输出无值的Optional字段。按以下步骤配置即可解决:
步骤1:引入JDK8类型适配依赖
需要引入jackson-datatype-jdk8模块支持Optional类型序列化:
Maven配置示例:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jdk8</artifactId> <version>与项目现有Jackson版本保持一致</version> </dependency>
Gradle配置示例:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:你的Jackson版本号'
步骤2:配置Jackson序列化规则
有两种配置方式可选,按需使用即可:
- 全局配置ObjectMapper
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; ObjectMapper objectMapper = new ObjectMapper() // 注册JDK8类型适配模块,让Optional正确序列化为内部值 .registerModule(new Jdk8Module()) // 序列化时排除空值、空Optional等不存在的字段 .setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
- 单独在实体类上配置
如果不想全局修改序列化规则,直接在MyEntityModel接口上添加注解即可:
@Value.Immutable @JsonSerialize(as = ImmutableMyEntityModel.class) @JsonDeserialize(as = ImmutableMyEntityModel.class) // 配置当前类序列化时排除空值、空Optional字段 @JsonInclude(JsonInclude.Include.NON_ABSENT) public interface MyEntityModel { // 原有字段定义无需修改 String myEntityId(); String status(); Optional<Integer> count(); Optional<Integer> version(); Optional<Map<String, String>> attributes(); }
配置完成后即可得到你预期的序列化结果:有值的Optional字段直接输出内部值,无值的Optional字段不会出现在JSON中。
内容的提问来源于stack exchange,提问作者bappak
相关产品推荐
相关产品推荐

