如何自定义Quarkus Smallrye GraphQL的JSON序列化以忽略空值?
自定义Quarkus Smallrye GraphQL的JSON序列化(忽略Null值)
由于Quarkus中Smallrye GraphQL的响应序列化依赖Eclipse Parsson(JSON-B规范的实现),可以通过以下两种方式实现忽略null值的需求:
方案1:全局JSON-B配置(应用级生效)
直接在application.properties中添加JSON-B全局配置,让所有JSON序列化操作都忽略null值:
quarkus.jsonb.serialization-include=NON_NULL
该配置会让Parsson在序列化时自动排除值为null的属性,无需编写额外代码。
方案2:针对GraphQL的局部配置(仅GraphQL响应生效)
如果只希望GraphQL的响应忽略null值,不影响应用其他模块的JSON序列化,可以创建一个带有@GraphQL限定符的CDI生产者,专门为GraphQL模块提供自定义的Jsonb实例:
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; import org.eclipse.microprofile.graphql.GraphQL; @ApplicationScoped public class GraphQLJsonbProducer { @Produces @GraphQL public Jsonb produceGraphQLJsonb() { JsonbConfig config = new JsonbConfig() .withNullValues(false); // 配置忽略null值 return JsonbBuilder.create(config); } }
为什么之前的方案无效?
你之前编写的普通ObjectMapper/JsonbConfig生产者没有生效,是因为Smallrye GraphQL模块会优先使用带有@GraphQL限定符的Jsonb实例,普通生产者无法覆盖GraphQL内部的序列化配置。
验证
启动应用后发起GraphQL请求,响应中的null属性会被自动过滤,例如原本包含"baz": null的响应会变为仅保留非null属性的结果:
{ "foo": "bar" }
内容的提问来源于stack exchange,提问作者Matthias Bechtold
相关产品推荐
相关产品推荐

