如何使用jaxrs-jsonb(JSON-B | JSR-367)发送空值?
实现JSON-B输出空值的几种方式
针对你的Thorntail/WildFly遗留系统(依赖jaxrs-jsonb),要实现类似Jackson @JsonInclude(Include.ALWAYS)的空值输出效果,可通过以下几种方式解决:
1. 全局生效的配置(推荐)
创建JAX-RS Provider配置JSON-B全局行为,强制输出所有空值字段:
import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; import javax.json.bind.JsonbConfig; @Provider public class JsonbGlobalConfig implements ContextResolver<Jsonb> { @Override public Jsonb getContext(Class<?> type) { JsonbConfig config = new JsonbConfig() .withNullValues(true); // 全局开启空值输出 return JsonbBuilder.create(config); } }
这个类会被JAX-RS自动扫描加载,所有REST接口的JSON序列化都会包含空值字段。
2. 类/字段级别的细粒度控制
如果只需要特定类或字段输出空值,用JSON-B的注解实现:
- 类级别:给实体类添加
@JsonbNillable,整个类的空值字段都会被输出:
import javax.json.bind.annotation.JsonbNillable; @JsonbNillable public class PersonApi { private String name; private Integer age; // getter/setter 省略 }
- 字段/方法级别:给目标字段或getter方法添加
@JsonbProperty(nillable = true):
public class PersonApi { private String name; @JsonbProperty(nillable = true) private Integer age; // getter/setter 省略 }
3. 配置文件方式(无需编码)
在项目的microprofile-config.properties或project-defaults.yml中添加全局配置:
- Properties格式:
jsonb-config.nulls=INCLUDE
- YAML格式:
jsonb-config: nulls: INCLUDE
通过配置文件即可直接开启全局空值输出。
验证效果:当PersonApi实例的name=Any、age=null时,序列化后会输出:
{ "name": "Any", "age": null }
内容的提问来源于stack exchange,提问作者leandro.dev
相关产品推荐
相关产品推荐

