当前位置: 首页 > 知识库问答 >
问题:

Spring Boot GraphQL无法加载架构

汪凌
2023-03-14

我在Spring Boot 2和GraphQL中使用了以下示例,但在加载graphiql时出现了以下错误,模式没有加载。

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

该代码通过postman但来自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
}

共有3个答案

龙令雪
2023-03-14

在Spring Boot 2中使用GraphQL时,不需要创建API后endpoint/GraphQL。以下是需要遵循的步骤:

第1步:在GraphQL的pom.xml中添加依赖项:

        <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
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);
    }
}

在此之后,endpoint/graphql将自动可用,GraphiQL也将正常工作。我在一篇博客文章中编写了一个简单的GraphQL和Spring Boot示例,其中包含GitHub中的工作代码。请参阅:http://softwaredevelopercentral.blogspot.com/2019/11/graphql-spring-boot-and-mysql-tutorial.html

慎兴业
2023-03-14

首先,您使用的是一个奇怪的堆栈。而graphql java工具最近一直生活在com下。graphql java在Maven中实际上是一个完全独立的堆栈。最新版本在新的groupId下发布。graphql java kickstart,以避免将来的混淆。

现在,如果您已经在使用graphql java工具,那么您需要的初学者是com。graphql java kickstart:graphql spring boot starter,因为它们打算一起使用。

您正在使用的启动器(com.graphql-java: graph ql-spring-boot-starter)旨在与纯graph ql-java一起使用。您只需要连接一个GraphQL类型的bean。有关更多详细信息,请参阅官方教程。

它们可以一起工作,请注意,这只是一个次优组合。

现在,出现此错误的原因是,您的HTTPendpoint(Spring控制器)不符合GraphQL over HTTP规范,而GraphiQL正期待着这一点(具体来说,GraphiQL正在使用POST变体)。邮递员不是,所以它过去了。

更改后端以期望请求中的JSON对象的最佳方法,形状如下:

{
  "query": "...",
  "operationName": "...",
  "variables": { "myVariable": "someValue", ... }
}
张献
2023-03-14

您需要使用属性查询、操作名称和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;
}
 类似资料:
  • 我正在使用Javase6手动部署webservice。我想使用@SchemaValidation来验证SOAP流量。在发布终结点期间,我收到错误: 原因:org.xml.sax.SAXParseException:s4s-att-invalid-value:元素“restriction”中“base”的属性值无效。记录原因:UndeclaredPrefix:无法将“xsd:string”解析为QN

  • 下面的代码是在pyspark shell中运行时的工作文件,但在spark submit master Thread中执行时失败。 我在这里怎么了? 错误:

  • 但随后: UPDATE:当使用master=“local”连接时,此操作工作,当连接到master=“MySparkCluster”时,此操作失败。

  • 有些人也遇到了同样的问题:https://community.cloudera.com/T5/web-ui-hue-beeswax/hue-and-presto-integration-error-on-page-load/TD-P/62353 我希望得到你的帮助!

  • 问题内容: 我在使用ASP.Net 4.0 Ajax时遇到了一个复杂的问题。…我在计算机上使用Visual Studio 2010创建了一个网站,并添加了一些以前可以正常使用的更新面板,但是突然我运行我的电脑时遇到了一系列错误网站 Microsoft JScript运行时错误:ASP.NET Ajax客户端框架无法加载。 Microsoft JScript运行时错误:“ Sys”未定义 奇怪的是,

  • 在我的Windows10机器上启动播放项目时遇到问题(在Win7上运行良好) 当我执行“激活器运行”时,我会得到以下结果: 我试过很多事情都没有成功。我试着从: 至 addSbtPlugin(“com.typesafe.play”%“sbt-plugin”%“2.3.2”) 我得到另一个错误: 再一次,我在Win10(64bit)上 这里真的需要一些帮助,被困了几天。