Java 字段未定义类型的验证错误:字段';寄存器';类型为';查询';是未定义的

Java 字段未定义类型的验证错误:字段';寄存器';类型为';查询';是未定义的,java,spring-boot,graphql,graphql-java,Java,Spring Boot,Graphql,Graphql Java,我是GrapQL新手。我试着用它来搭配弹簧靴。我可以成功地进行查询,它正在返回我需要的数据,但我现在想使用变异。当他注册时,我需要给数据库添加一个用途 这是我的schema.graphqls文件: type Token { token: String } type Register { message: String } type User { username: String! firstName: String! lastName: String!

我是GrapQL新手。我试着用它来搭配弹簧靴。我可以成功地进行查询,它正在返回我需要的数据,但我现在想使用变异。当他注册时,我需要给数据库添加一个用途

这是我的schema.graphqls文件:

type Token {
    token: String
}
type Register {
    message: String
}
type User {
    username: String!
    firstName: String!
    lastName: String!
    password: String!
    role: String!
}

type Query {
    login(username: String, password: String): Token
}

type Mutation {
    register(input: RegisterUserInput!): Register
}

input RegisterUserInput {
    username: String!
    firstName: String!
    lastName: String!
    password: String!
    role: String!
}

schema {
    query: Query
    mutation: Mutation
}
所以,正如您所看到的,寄存器是突变类型的,它是按原样添加到模式查询中的。但出于某种原因,它看起来并没有发生变异,它只是试图在查询中找到类型

这是我的控制器:

@Autowired
    private UserService userService;

    /**
     * Login the user and return generated token
     * @param query
     * @return String token
     */
    @PostMapping("/login")
    public ResponseEntity<Object> login(@RequestBody String query){
        ExecutionResult executionResult = userService.getGraphQL().execute(query);

        // Check if there are errors
        if(!executionResult.getErrors().isEmpty()){
            return new ResponseEntity<>(executionResult.getErrors().get(0).getMessage(), HttpStatus.UNAUTHORIZED);
        }

        return new ResponseEntity<>(executionResult, HttpStatus.OK);
    }

    /**
 * Create new user and save him to database
 * @param mutation
 * @return String message
 */
@PostMapping("/register")
public ResponseEntity<Object> register(@RequestBody String mutation){
    ExecutionResult executionResult = userService.getGraphQL().execute(mutation);

    // Check if there are errors
    if(!executionResult.getErrors().isEmpty()){
        return new ResponseEntity<>(executionResult.getErrors().get(0).getMessage(), HttpStatus.UNAUTHORIZED);
    }

    return new ResponseEntity<>(executionResult, HttpStatus.OK);
}
我的登录服务器:

@Autowired
    private AppUserRepository appUserRepository;

    private JwtGenerator jwtGenerator;

    public LoginDataFetcher(JwtGenerator jwtGenerator) {
        this.jwtGenerator = jwtGenerator;
    }

    @Override
    public TokenDAO get(DataFetchingEnvironment dataFetchingEnvironment) {
        String username = dataFetchingEnvironment.getArgument("username");
        String password = dataFetchingEnvironment.getArgument("password");

        AppUser appUser = appUserRepository.findByUsername(username);

        // If user is not foung
        if(appUser == null){
            throw new RuntimeException("Username does not exist");
        }

        // If the user is fount check passwords
        if(!appUser.getPassword().equals(password)){
            throw new RuntimeException("Incorrect password");
        }

        // Generate the token
        String token = jwtGenerator.generate(appUser);

        return new TokenDAO(token);
    }
@Autowired
    private AppUserRepository appUserRepository;

    @Override
    public RegisterDAO get(DataFetchingEnvironment dataFetchingEnvironment) {
        String username = dataFetchingEnvironment.getArgument("username");
        String firstName = dataFetchingEnvironment.getArgument("firstName");
        String lastName = dataFetchingEnvironment.getArgument("lastName");
        String password = dataFetchingEnvironment.getArgument("password");
        String role = dataFetchingEnvironment.getArgument("role");

        AppUser appUser = appUserRepository.findByUsername(username);

        // Check if username exists
        if(appUser != null){
            throw new RuntimeException("Username already taken");
        }

        AppUser newAppUser = new AppUser(username, password, role, firstName, lastName);

        // Save new user
        appUserRepository.save(newAppUser);

        return new RegisterDAO("You have successfully registered");
    }
RegisterDataFetcher:

@Autowired
    private AppUserRepository appUserRepository;

    private JwtGenerator jwtGenerator;

    public LoginDataFetcher(JwtGenerator jwtGenerator) {
        this.jwtGenerator = jwtGenerator;
    }

    @Override
    public TokenDAO get(DataFetchingEnvironment dataFetchingEnvironment) {
        String username = dataFetchingEnvironment.getArgument("username");
        String password = dataFetchingEnvironment.getArgument("password");

        AppUser appUser = appUserRepository.findByUsername(username);

        // If user is not foung
        if(appUser == null){
            throw new RuntimeException("Username does not exist");
        }

        // If the user is fount check passwords
        if(!appUser.getPassword().equals(password)){
            throw new RuntimeException("Incorrect password");
        }

        // Generate the token
        String token = jwtGenerator.generate(appUser);

        return new TokenDAO(token);
    }
@Autowired
    private AppUserRepository appUserRepository;

    @Override
    public RegisterDAO get(DataFetchingEnvironment dataFetchingEnvironment) {
        String username = dataFetchingEnvironment.getArgument("username");
        String firstName = dataFetchingEnvironment.getArgument("firstName");
        String lastName = dataFetchingEnvironment.getArgument("lastName");
        String password = dataFetchingEnvironment.getArgument("password");
        String role = dataFetchingEnvironment.getArgument("role");

        AppUser appUser = appUserRepository.findByUsername(username);

        // Check if username exists
        if(appUser != null){
            throw new RuntimeException("Username already taken");
        }

        AppUser newAppUser = new AppUser(username, password, role, firstName, lastName);

        // Save new user
        appUserRepository.save(newAppUser);

        return new RegisterDAO("You have successfully registered");
    }
我在控制台中遇到的错误:

graphql.GraphQL                          : Query failed to validate : '{
    register(username: "user", firstName: "Bla", lastName: "Blabla", password: "password", role: "DEVELOPER") {
        message
    }
}'
谢谢你的帮助

更新 根据得到的答案,我更改了模式文件,如下所示:

query UserQuery{
    login(username: String, password: String){
        token
    }
}

mutation UserMutation{
    register(input: RegisterUserInput) {
        message
    }
}

input RegisterUserInput {
    username: String!
    firstName: String!
    lastName: String!
    password: String!
    role: String!
}

schema {
    query: UserQuery
    mutation: UserMutation
}
但现在我得到了这个错误:

解析类型“query”时,操作类型“UserQuery”不存在 解析类型“突变”时,操作类型“UserMutation”不存在


那么现在的问题是什么?我怎样才能做到这一点呢?

您告诉GraphQL您正在请求一个查询,而实际上
register
是一个变种。编写GraphQL请求时,查询的语法通常遵循以下格式:

query someOperationName {
  login {
    # other fields
  }
}
编写变异时,只需指定:

mutation someOperationName {
  register {
    # other fields
  }
}
您可以省略操作名称,但最好将其包含在内。您可以看到以下格式的示例:

{
  someQuery {
    # other fields
  }
}
在本例中,操作名称和操作类型(查询与变异)都被省略。这仍然是一个有效的请求,因为GraphQL简单地假设您在退出操作类型时是指
query
。根据规范:

如果文档仅包含一个操作,则该操作可能未命名或以速记形式表示,该速记形式同时省略查询关键字和操作名称

因此,在您的请求中,GraphQL假设
register
是一个查询,而事实上它是一个变异,因此返回一个错误


同样,在编写请求时,最好始终包含操作名称和查询/变异关键字。

我认为您不理解答案,不需要更改模式。您能显示您正在触发的查询/变异字符串吗?它应该是这样的:
mutationregister{register(输入:{username:“someName”,…}){…}
Yes,你是对的。成功了。非常感谢。