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

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,触发空指针异常。

解决方法

有两种方式修正参数名不匹配的问题:

  1. 显式指定参数名称
    在@Argument注解中明确指定Schema中定义的参数名userInput:
@MutationMapping(name = "save")
public UserDto save(@Argument("userInput") UserDto user) {
    return userService.save(user);
}
  1. 修改参数名与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:39:17