Jakarta JSON设置withNullValues为true仍忽略Null字段问题排查
以下是几种可能导致配置withNullValues(true)后仍省略null字段的情况:
TomEE全局JSON-B配置覆盖代码设置
TomEE默认使用Apache Johnzon作为JSON-B实现,若全局配置(比如conf/system.properties里的johnzon.jsonb.include-null-values属性,或者启动参数-Djohnzon.jsonb.include-null-values=false)设为不包含空值,会优先于代码中的JsonbConfig生效,导致null字段被忽略。实体类字段注解优先级更高
如果inputObj对应的实体类字段标注了@JsonbProperty(nillable = false),会强制该字段为null时不输出;或者标注了@JsonbTransient,会直接忽略该字段,这些注解的优先级高于全局配置。示例:public class InputObj { @JsonbProperty(nillable = false) private String nullField; // 其他字段 }未使用自定义配置的Jsonb实例
在TomEE的CDI环境中,如果代码同时通过@Inject Jsonb jsonb注入了容器管理的Jsonb实例,会覆盖手动创建的带配置的实例,导致配置不生效。必须确保序列化时使用的是JsonbBuilder.create(config)生成的实例。实体类字段访问性不符合要求
若实体类的字段是private且没有符合JavaBean规范的getter方法(比如字段username对应的getter不是getUsername()),JSON-B无法正确识别该字段,自然不会输出null值。JSON-B实现版本存在兼容性问题
Jakarta EE9.1对应JSON-B 2.0规范,若TomEE内置的Johnzon版本过低(比如低于1.2.x),可能存在withNullValues(true)配置不生效的bug,需要确认版本兼容性。
内容的提问来源于stack exchange,提问作者ps0604

