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

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序列化规则

有两种配置方式可选,按需使用即可:

  1. 全局配置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);
  1. 单独在实体类上配置
    如果不想全局修改序列化规则,直接在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:09:03