Spring Boot GraphQL Mutation出现NullPointerException问题求助
Spring Boot GraphQL Mutation 空指针问题排查
我在学习Spring Boot整合GraphQL时,编写了一个保存用户信息到数据库的Mutation,但通过GraphiQL UI调用该Mutation时抛出NullPointerException,传入的对象无法映射到UserDto,触发空指针异常。
相关代码
Controller代码
@Controller public class UserController { private UserService userService; public UserController(UserService userService) { this.userService = userService; } @QueryMapping(name = "userById") public UserDto findUserById(@Argument Long id) { return userService.findById(id); } @QueryMapping public String removeUserById(@Argument Long id) { return userService.removeById(id); } @MutationMapping(name = "save") public UserDto save(@Argument UserDto user) { return userService.save(user); } @QueryMapping(name = "users") public List<UserDto> findAll() { return userService.findAll(); } }
GraphQL Schema定义
schema { query: Query mutation: Mutation } type Query{ users:[User] userById(id:ID):User } type Mutation{ save(userInput:UserInput):User } #input types input UserInput{ firstName:String! lastName:String! emailAddress:String! ipAddress:String! address:AddressInput! } input AddressInput{ addressLine1:String! addressLine2:String! addressLine3:String! addressLine4:String! addressLine5:String! addressPostCode:Int! } #object types type User{ firstName:String! lastName:String! emailAddress:String! ipAddress:String! address:Address! } type Address{ addressLine1:String! addressLine2:String! addressLine3:String! addressLine4:String! addressLine5:String! addressPostCode:Int! }
Mutation调用语句
mutation Save($userDto: UserInput!) { save(userInput: $userDto) { firstName lastName emailAddress ipAddress address { addressLine1 addressLine2 addressLine3 addressLine4 addressLine5 addressPostCode } } }
调用变量
{ "userDto": { "ipAddress": "192.168.0.124", "firstName": "John", "lastName": "Mark", "emailAddress": "john@gmail.com", "address": { "addressLine1": "251 WC", "addressLine2": "UC MAIN", "addressLine3": "PB121", "addressLine4": "New York", "addressLine5": "USA", "addressPostCode": 457821 } } }
执行结果
{ "errors": [ { "message": "INTERNAL_ERROR for b6287602-fc10-6ecf-2091-b57ceaeb9f0a", "locations": [ { "line": 2, "column": 3 } ], "path": [ "save" ], "extensions": { "classification": "INTERNAL_ERROR" } } ], "data": { "save": null } }
控制台错误信息
java.lang.NullPointerException: Cannot invoke "com.graphql.sample.dto.UserDto.getEmailAddress()" because "userDto" is null
问题原因及解决方案
核心问题
GraphQL Schema中定义的Mutation参数名为userInput,但Controller的save方法中@Argument注解的参数名为user,两者不匹配,导致Spring GraphQL无法将传入的userInput参数映射到UserDto对象,最终user参数为null,触发空指针异常。
解决方法
有两种方式修正参数名不匹配的问题:
- 显式指定参数名称
在@Argument注解中明确指定Schema中定义的参数名userInput:
@MutationMapping(name = "save") public UserDto save(@Argument("userInput") UserDto user) { return userService.save(user); }
- 修改参数名与Schema一致
直接将Controller方法的参数名改为userInput,与Schema中的参数名保持一致:
@MutationMapping(name = "save") public UserDto save(@Argument UserDto userInput) { return userService.save(userInput); }
额外检查点
确保UserDto及其嵌套的AddressDto的字段名与Schema中UserInput、AddressInput的字段名完全一致(包括大小写),比如addressPostCode、addressLine1等字段,避免因字段名不匹配导致的映射失败。
内容的提问来源于stack exchange,提问作者Amit-Chavda
相关产品推荐
相关产品推荐

