GraphQL非空字段返回null错误求助(Spring Boot环境)
GraphQL非空字段返回Null问题解决
问题现象
发起带参数的GraphQL查询后,收到如下错误:
{ "errors": [ { "message": "路径'/greeting/name'处的字段被声明为非空类型,但获取数据的代码错误地返回了null值。GraphQL规范要求父字段设为null,若父字段也非空则向上传递null。该非空类型是Person类型下的String", "path": [ "greeting", "name" ], "extensions": { "classification": "NullValueInNonNullableField" } } ], "data": { "greeting": null } }
相关代码
Schema定义
type Person{ name: String } type Query { greeting(name: String!): Person }
控制器代码
@Controller public class TestGraphController { @QueryMapping public String greeting(@Argument String name){ System.out.println("\n\nrequest-> " + name); return "Hello, " + name; } }
查询请求
query { greeting(name: "Test") { name } }
错误原因
Schema中greeting查询定义返回Person类型,但控制器方法实际返回的是String类型,两者不匹配。GraphQL执行查询时,期望从greeting获取Person对象并读取其name字段,但实际得到的字符串没有name属性,导致返回null,触发非空字段错误。
解决方案
提供两种可行方案,根据需求选择:
方案一:调整控制器返回Person对象
- 创建Person实体类:
public class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } }
- 修改控制器方法,返回Person实例:
@Controller public class TestGraphController { @QueryMapping public Person greeting(@Argument String name){ System.out.println("\n\nrequest-> " + name); return new Person("Hello, " + name); } }
修改后执行原查询,即可得到正确结果:
{ "data": { "greeting": { "name": "Hello, Test" } } }
方案二:调整Schema让greeting直接返回String
- 修改Schema定义:
type Query { greeting(name: String!): String }
- 修改查询请求,直接获取返回值:
query { greeting(name: "Test") }
执行后结果为:
{ "data": { "greeting": "Hello, Test" } }
内容的提问来源于stack exchange,提问作者therepanic
相关产品推荐
相关产品推荐

