@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
相关产品推荐
相关产品推荐

