[英]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.