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

@JsonInclude(Include.NON_NULL)不生效:DTO序列化仍保留null字段

问题分析:@JsonInclude(NON_NULL)注解不生效的原因及解决思路

你的@JsonInclude(JsonInclude.Include.NON_NULL)注解不生效,核心原因是DTO继承的JSONSerializable类自带了自定义序列化逻辑,绕过了Jackson的处理流程,具体分析如下:

1. 序列化逻辑被父类覆盖

你的AccountDataForAPI继承了gw.integration.document.production.json.JSONSerializable,这类框架自带的序列化接口通常会提供专属的toJSON()或类似方法生成JSON,而非依赖Jackson的ObjectMapper处理。Jackson的@JsonInclude注解仅在Jackson主导序列化过程时生效,若实际使用的是父类的自定义序列化逻辑,注解自然无法发挥作用。

2. 构造方法显式赋值null的影响

在priorAccount构造方法中,你给account5、salesAmountOver5k等字段显式赋值为null,如果父类的序列化逻辑是直接遍历所有字段并输出(不判断值是否为null),这些null值会被直接写入JSON,完全不受Jackson注解约束。

验证与解决办法

验证方式

写个简单测试,用Jackson的ObjectMapper直接序列化DTO实例:

ObjectMapper mapper = new ObjectMapper();
AccountDataForAPI dto = new AccountDataForAPI(priorAccountInstance);
String json = mapper.writeValueAsString(dto);
System.out.println(json);

如果此时输出的JSON中无null字段,说明项目确实使用了父类的序列化逻辑而非Jackson;若仍有null字段,再检查Jackson版本兼容性,或是否存在全局配置覆盖了类级别注解。

解决思路

  • 适配父类序列化规则:查看JSONSerializable的文档或源码,确认是否有自带的忽略null字段配置方式(如父类注解、方法参数等),按框架要求配置即可。
  • 强制使用Jackson序列化:若项目允许,修改序列化逻辑,改用ObjectMapper处理该DTO的序列化,确保Jackson注解生效。
  • 手动过滤null字段:若必须使用父类序列化逻辑,可在DTO中重写父类的序列化方法,遍历属性时手动跳过值为null的字段。

内容的提问来源于stack exchange,提问作者miikey722

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:32:41