【问题标题】:Spring-boot not creating graphql endpointSpring-boot 未创建 graphql 端点
【发布时间】:2020-03-03 23:02:00
【问题描述】:

我想将 Graphql 集成到我的项目中。我在(几个)教程之后开始了一个新的 Spring Boot 项目,但它们都没有工作:graphql 端点没有出现,似乎未检测到 graphqls 文件?

我的项目是一个 Maven 项目,具有以下依赖项:

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>5.10.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>5.6.1</version>
</dependency>
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>5.10.0</version>
    <scope>runtime</scope>
</dependency>

为了保持帖子简短,我尝试只放置相关依赖项,避免其他依赖项(Lombok、jpa 等...)

还有我的 graphqls 文件(在资源文件夹中):

type Vehicle {
    id: ID!,
    type: String,
    modelCode: String,
    brandName: String,
    launchDate: String
}
type Query {
    vehicles(count: Int):[Vehicle]
    vehicle(id: ID):Vehicle
}
type Mutation {
    createVehicle(type: String!, modelCode: String!, brandName: String, launchDate: String):Vehicle
}

根据文档,应该创建 graphql 端点,因为我有一个 graphql-spring-boot-starter 依赖项和一个模式,它将使用我的 vehicle.graphqls 文件(以及 graphql-java-tools 依赖项)自动创建

如果将 graphql-spring-boot-starter 作为依赖项添加到启动应用程序并且应用程序中存在 GraphQLSchema bean,则可以在 /graphql 访问 servlet [...] 当在类路径中找到支持的 graphql-java 模式库时,也可以自动创建 GraphQL 模式。

我使 graphql 端点出现的唯一方法是以编程方式创建模式(我想避免这种情况):

@Bean
    GraphQLSchema schema() {
    return GraphQLSchema.newSchema()
            .query(GraphQLObjectType.newObject()
                    .name("query")
                    .field(field -> field
                            .name("test")
                            .type(Scalars.GraphQLString)
                            .dataFetcher(environment -> "response")
                            )
                    .build())
            .build();
}

我想我错过了一些东西,但经过一天的尝试,我现在卡住了,我看不出我的错误是什么。

【问题讨论】:

  • 您不需要(完全)手动构建架构,但您确实需要构建它。由于您已经定义了架构,您只需要使用它来构建端点。有关详细信息,请参阅this tutorial
  • 我看不出我所做的和你提到的教程之间的区别,原理是一样的。在 json 文件中定义了一个模式,并为搜索实现了类(在我的例子中为 GraphQLResolver)。但由于我使用com.graphql-java-kickstart.graphql-java-tool,我不应该像com.graphql-java.graphql-java 那样编写这个GraphQLProvider。但我可能错过了你的意思?
  • 好吧,如果 kickstart 包应该为您处理,我想不会。
  • 尝试设置此属性:graphql.servlet.enabled=true
  • 我也面临同样的问题......你能解决这个问题吗?

标签: java spring-boot graphql graphql-java


【解决方案1】:

您是否将GraphQLQueryResolver 公开为@Bean,以便自动配置知道搜索您的架构文件?

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GraphQLConfiguration {

    @Bean
    QueryResolver queryResolver() {
        return new QueryResolver();
    }

    @Bean
    MutationResolver mutationMutation() {
        return new MutationResolver();
    }

}

Documentation for author's quote

如果将 graphql-spring-boot-starter 作为依赖项添加到启动应用程序并且应用程序中存在 GraphQLSchema bean,则可以在 /graphql 访问 servlet。查看简单示例,了解所需的最低要求。

当在类路径中找到支持的 graphql-java 模式库时,也可以自动创建 GraphQL 模式。

遵循该文档线程最终将引导您 the GraphQL Java Tools project documentation 解释如何从您的 .graphqls 定义生成必要的 GraphQLSchema 对象。最后,我们必须以某种方式将这些定义映射到 Java,这是 Spring Boot,所以@Bean 你的根解析器,所以它有一个可以使用的实现,你应该很高兴。

【讨论】:

  • QueryResolverMutationResolver 来自哪里?我无法在 GraphQL java 库中找到这些对象
猜你喜欢
  • 2022-11-28
  • 2020-09-23
  • 2023-01-31
  • 2020-12-22
  • 1970-01-01
  • 2020-08-19
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多