graphql servlet 未使用 graphql-java-tools 启动(未找到模式文件?)

Posted

技术标签:

【中文标题】graphql servlet 未使用 graphql-java-tools 启动(未找到模式文件?)【英文标题】:graphql servlet not started with graphql-java-tools (schema files not found?) 【发布时间】:2021-01-02 04:48:19 【问题描述】:

因此,根据 graphql-java-kickstart/graphql-java-tools,当将依赖项“com.graphql-java-kickstart:graphql-spring-boot-starter”添加到项目和 .graphqls 架构文件会被自动扫描。

我有以下依赖项:

...
        <spring-boot.version>2.3.3.RELEASE</spring-boot.version>
        <graphql.version>7.0.1</graphql.version>
        <graphql-java-tools.version>6.2.0</graphql-java-tools.version>

...

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>$spring-boot.version</version>
        </dependency>

        <!-- graphql -->
        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>$graphql.version</version>
        </dependency>

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

        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphql-java-tools</artifactId>
            <version>$graphql-java-tools.version</version>
        </dependency>

架构定义:

in query.graphqls:
type Query 
    user(username: String!)
    users: [User]


in user.graphqls:
type User 
    userId: Number!
    username: String!

还有一个 GraphQLQueryResolver:

@Component
public class UserQueryResolver implements GraphQLQueryResolver 
    private final UserRepository userRepository;

    public UserQueryResolver(UserRepository userRepository) 
        this.userRepository = userRepository;
    

    public Iterable<User> users() 
        return this.userRepository.findAll();
    

    public User user(String username) 
        return this.userRepository.findByUsername(username).orElseThrow();
    


public interface UserRepository extends JpaRepository<User, Integer> 
    Optional<User> findByUsername(String username);

根据文档:

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

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

graphql-java-tools 库应该在这些条件下自动创建模式:

所有 GraphQLResolver 和 GraphQLScalar bean 以及 SchemaParserDictionary 类型的 bean(用于提供所有其他类)将用于创建 GraphQLSchema。类路径上名为 *.graphqls 的任何文件都将用于提供模式定义。有关详细信息,请参阅自述文件。

我想我拥有它需要的一切,但导航到 localhost:8080/graphql 会得到 404。 注意:localhost:8080/graphiql 有效,但无法加载架构。它说:


  "timestamp": "2020-09-15T12:22:21.748+00:00",
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/graphql"

我错过了什么?

【问题讨论】:

通过浏览器尝试/playground 这也给出了 404。 【参考方案1】:

显然应用程序找不到任何 JpaRepositories,因为 SpringBootApplication 起始类位于 com.package.some.app 中,而存储库位于 com.package.some.domain 中。存储库。组件扫描器仅扫描带有 com.package.som.app.*

包的组件

【讨论】:

以上是关于graphql servlet 未使用 graphql-java-tools 启动(未找到模式文件?)的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 graphql 端点(不使用 Graph.cool)

Facebook 的 Graph API 是不是使用 GraphQL?

GraphQL/Graph.cool 查询过滤嵌套关系

GraphQL 浅谈,从理解 Graph 开始

模拟 graph-ql 请求

GraphQL graph.cool 用户查询不适用于 Auth0 令牌