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

Spring Boot 3.3.0迁移后如何保留GraphQL响应中的Null字段

解决Spring Boot 3.3.0迁移后GraphQL响应丢失Null字段的问题

问题背景

将Spring Boot应用迁移至3.3.0版本后,使用com.graphql-java-kickstart系列GraphQL依赖时,响应中值为Null的字段不再返回,仅保留非Null字段。

解决方案

1. 升级GraphQL依赖至Spring Boot 3.x兼容版本

原依赖版本未适配Spring Boot 3.x的Jakarta EE规范,可能引发序列化行为异常。需替换为兼容版本:

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>16.2.0</version> <!-- 适配Spring Boot 3.x的稳定版本 -->
</dependency>
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>14.0.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>12.0.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-extended-scalars</artifactId>
    <version>24.0</version> <!-- 与升级后的graphql-java版本匹配 -->
</dependency>

2. 配置序列化策略强制保留Null字段

通过Jackson序列化规则配置,让GraphQL响应始终包含Null字段:

方式一:配置文件(application.properties)

# 强制序列化所有字段,包括Null值
graphql.servlet.jackson.serialization-inclusion=ALWAYS
# 保留Map中的Null值
graphql.servlet.jackson.serialization.write-null-map-values=true
# 空数组正常返回
graphql.servlet.jackson.serialization.write-empty-json-arrays=true

方式二:自定义配置类

若配置文件不生效,可通过Java配置类自定义序列化规则:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.graphql.spring.boot.response.DefaultGraphQLResponseBodyBuilder;
import com.graphql.spring.boot.response.GraphQLResponseBodyBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GraphQLSerializationConfig {

    @Bean
    public ObjectMapper graphQLObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 始终包含所有字段,无论是否为Null
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        // 启用Null Map值序列化
        objectMapper.enable(SerializationFeature.WRITE_NULL_MAP_VALUES);
        // 启用空JSON数组序列化
        objectMapper.enable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS);
        return objectMapper;
    }

    @Bean
    public GraphQLResponseBodyBuilder graphQLResponseBodyBuilder(ObjectMapper objectMapper) {
        return new DefaultGraphQLResponseBodyBuilder(objectMapper);
    }
}

3. 验证效果

重启应用后查询User类型数据,响应将恢复包含所有字段(包括值为Null的字段):

{
  "id": 1,
  "name": "username",
  "description": null,
  "greeting": null,
  "listFriend": null
}

内容的提问来源于stack exchange,提问作者Hytobi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:37:06