簡體   English   中英

Spring Boot GraphQL 無法加載架構

[英]Spring Boot GraphQL can't load schema

我將以下示例與 Spring Boot 2+ 和 GraphQL 一起使用,但在加載 graphiql 時出現以下錯誤,架構未加載。

https://github.com/TechPrimers/spring-boot-graphql-query-example

該代碼通過來自郵遞員但來自 Graphiql 的 POST 調用工作。

@RestController
public class GraphQLController {

    private GraphQLService graphQLService;

    public GraphQLController(GraphQLService graphQLService) {
        this.graphQLService = graphQLService;
    }

    @PostMapping("/graphql")
    public ExecutionResult graphQl(@RequestBody String query) {
        ExecutionResult result = graphQLService.getGraphQL().execute(query);
        return result;
    }
}

{
  "data": null,
  "errors": [
    {
      "message": "Invalid Syntax : offending token '\"query\"' at line 1 column 1",
      "sourcePreview": "{\"query\":\"\\n  query IntrospectionQuery {\\n    __schema {\\n      queryType { name }\\n      mutationType { name }\\n      types {\\n        ...FullType\\n      }\\n      directives {\\n        name\\n        description\\n        locations\\n        args {\\n          ...InputValue\\n        }\\n      }\\n    }\\n  }\\n\\n  fragment FullType on __Type {\\n    kind\\n    name\\n    description\\n    fields(includeDeprecated: true) {\\n      name\\n      description\\n      args {\\n        ...InputValue\\n      }\\n      type {\\n        ...TypeRef\\n      }\\n      isDeprecated\\n      deprecationReason\\n    }\\n    inputFields {\\n      ...InputValue\\n    }\\n    interfaces {\\n      ...TypeRef\\n    }\\n    enumValues(includeDeprecated: true) {\\n      name\\n      description\\n      isDeprecated\\n      deprecationReason\\n    }\\n    possibleTypes {\\n      ...TypeRef\\n    }\\n  }\\n\\n  fragment InputValue on __InputValue {\\n    name\\n    description\\n    type { ...TypeRef }\\n    defaultValue\\n  }\\n\\n  fragment TypeRef on __Type {\\n    kind\\n    name\\n    ofType {\\n      kind\\n      name\\n      ofType {\\n        kind\\n        name\\n        ofType {\\n          kind\\n          name\\n          ofType {\\n            kind\\n            name\\n            ofType {\\n              kind\\n              name\\n              ofType {\\n                kind\\n                name\\n                ofType {\\n                  kind\\n                  name\\n                }\\n              }\\n            }\\n          }\\n        }\\n      }\\n    }\\n  }\\n\"}\n",
      "offendingToken": "\"query\"",
      "locations": [
        {
          "line": 1,
          "column": 1,
          "sourceName": null
        }
      ],
      "errorType": "InvalidSyntax",
      "path": null,
      "extensions": null
    }
  ],
  "dataPresent": false,
  "extensions": null
}

您需要使用屬性 query、operationName 和 arg 創建自己的對象。

public class Data {
    private String query;

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }
}

@PostMapping("/graphql")
public ExecutionResult graphQl(@RequestBody Data query) {
    ExecutionResult result = graphQLService.getGraphQL().execute(query.getQuery());
    return result;
}

首先,您使用的是一個奇怪的堆棧。 雖然graphql-java-tools最近一直存在於 Maven 中的com.graphql-java groupId 下,但它實際上是一個完全獨立的堆棧。 最新版本發布在新的 groupId com.graphql-java-kickstart以避免將來混淆。

現在,如果您已經在使用graphql-java-tools ,那么您需要的 Starter 是com.graphql-java-kickstart:graphql-spring-boot-starter因為它們打算一起使用。

您正在使用的啟動器( com.graphql-java:graphql-spring-boot-starter )旨在與純graphql-java 您只需要連接一個GraphQL類型的 bean。 詳情請參閱官方教程

它們可以一起工作,請注意,這只是一個次優的組合。

現在,您收到此錯誤的原因是您的 HTTP 端點(Spring 控制器)不符合GraphQL-over-HTTP 規范,而 GraphiQL 正在期待這一點(具體來說,GraphiQL 正在使用POST 種類)。 郵遞員不是,所以它通過了。

更改后端以期望請求中的 JSON 對象的最佳方式,其形狀如下:

{
  "query": "...",
  "operationName": "...",
  "variables": { "myVariable": "someValue", ... }
}

在 Spring Boot 2+ 中使用 GraphQL 時,無需創建 POST API 端點/graphql 以下是要遵循的步驟:

第 1 步:在 pom.xml 中為 GraphQL 添加依賴項:

        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>5.0.2</version>
        </dependency>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-java-tools</artifactId>
            <version>5.2.4</version>
        </dependency>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphiql-spring-boot-starter</artifactId>
            <version>5.0.2</version>
        </dependency>

第 2 步:創建 GraphQL 架構:這是一個示例 GraphQL 架構:

type Employee {
  id: ID!
  name: String!
  department: String! 
  salary: Int!  
} 

type Query { 
  getEmployees: [Employee]! 
  countEmployees: Float!
  getEmployee(id: ID):Employee
} 

type Mutation { 
    newEmployee (name: String!, department: String!, salary: Int!): Employee
    deleteEmployee(id: ID): Boolean!
}

第 3 步:創建 GraphQL 類並用注解@Component標記它們這里是一個示例類:

@Component
public class EmployeeQuery implements GraphQLQueryResolver {

    @Autowired
    private EmployeeService employeeservice;

    public List<Employee> getEmployees() {
        return employeeservice.findAll();
    }

    public long countEmployees() {
        return employeeservice.count();
    }

    public Optional<Employee> getEmployee(final int id) {
        return employeeservice.findById(id);
    }
}

在此之后,端點/graphql自動可用,GraphiQL 也可以正常工作。 我在博客文章中編寫了一個簡單的 GraphQL 和 Spring Boot 示例,其中包含 GitHub 中的工作代碼。 請參考: http : //softwaredevelopercentral.blogspot.com/2019/11/graphql-spring-boot-and-mysql-tutorial.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM