Jackson序列化:JsonInclude.NON_ABSENT无法忽略null值的问题求助
问题原因
你使用Lombok的@Value注解生成不可变类,该注解会将所有字段设为final并生成全参构造器。通过@Builder构建ProductPart时,未指定payingInformation的情况下,构建器会传递null给构造器,导致该字段被显式赋值为null。虽然配置了@JsonInclude(JsonInclude.Include.NON_ABSENT),但在Lombok不可变类的场景下,Jackson对字段的处理逻辑可能导致注解未生效。
具体解决方案
方案1:改用NON_NULL注解
将类上的@JsonInclude(JsonInclude.Include.NON_ABSENT)替换为@JsonInclude(JsonInclude.Include.NON_NULL),或者直接在payingInformation字段上单独添加该注解:
@Builder @Value @JsonInclude(JsonInclude.Include.NON_NULL) public class ProductPart { @NonNull Long productId; @NonNull Integer offerId; @Builder.Default @NonNull ActivationPeriodPart activationPeriod = ActivationPeriodPart.builder().build(); @Singular List<ValuePart> values; @Builder.Default @NonNull Date orderDateTime = new Date(1529897304000L); PayingInformationPart payingInformation; }
NON_NULL会直接忽略所有值为null的字段,在Lombok不可变类场景下通常能直接生效。
方案2:用Optional包装字段
将payingInformation字段改为Optional<PayingInformationPart>类型,未设置该字段时其值为Optional.empty(),NON_ABSENT会自动忽略这种空的Optional:
@Builder @Value @JsonInclude(JsonInclude.Include.NON_ABSENT) public class ProductPart { // 其他字段保持不变 Optional<PayingInformationPart> payingInformation; }
构建对象时,无需额外处理空值;若需要设置该字段,使用Optional.of(...)包装实例即可。
方案3:引入Jackson-Lombok模块
若项目未引入jackson-datatype-lombok依赖,Jackson可能无法正确识别Lombok生成的类结构,导致注解失效。添加以下Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-lombok</artifactId> <version>你的Jackson版本号</version> </dependency>
同时在Jackson的ObjectMapper中注册该模块:
ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new LombokModule());
验证
修改后重新序列化目标对象,payingInformation字段将不再出现在序列化结果中。
内容的提问来源于stack exchange,提问作者Stitch

