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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:40:37