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
相关产品推荐
相关产品推荐

