gpt4 book ai didi

java - 将多个 graphQL 模式文件映射到单独的解析器 - Spring Boot

转载 作者:行者123 更新时间:2023-12-02 08:58:17 26 4
gpt4 key购买 nike

我发现将查询与一个架构文件分开确实很困难。我想要这样的东西:

car.graphqls

type Query {
car(id: ID!): Car
}

type Car {
id: ID!,
name: String!
}

house.graphqls

type Query {
house(id: ID!): House
}

type House {
id: ID!,
owner: String,
street: String
}

我搜索了很多,但找不到一种方法来编写两个 java 类并在其中一个类中实现 getHouse() ,在另一个类中实现 getCar()

@Component
public class CarQuery implements GraphQLQueryResolver {

@Autowired
private CarService carService;

public List<Car> getCar(final int id) {
return this.carService.getCar(id);
}
}

public class HouseQuery implements GraphQLQueryResolver {

@Autowired
private HouseService houseService;

public List<House> getHouse(final int id) {
return this.houseService.getHouse(id);
}
}

我发现我正在使用的 graphql-java-tools 包将搜索整个项目并查找所有架构文件(以 .graphqls 结尾) ,但是我上面显示的代码给了我这个错误:

Caused by: com.coxautodev.graphql.tools.FieldResolverError: No method found with any of the following signatures (with or without one of [interface graphql.schema.DataFetchingEnvironment] as the last argument), in priority order:

com.example.polls.resolvers.CarQuery.house(~count)
com.example.polls.resolvers.CarQuery.getHouse(~count)

我还发现一些建议,即架构文件中只需要一个根查询,并扩展架构文件中的所有其他查询类型。我尝试向 house.graphqls 写入类似这样的内容,但失败了:

extend Type Query {
house(id: ID!): House
}

有没有办法告诉 graphql 和 java 我想要将哪个模式文件映射到哪个 java 解析器文件?

最佳答案

谢谢 AllirionX。您的回答很有帮助。

我只想向所有正在寻找答案的人总结最终解决方案,即如何创建多个架构文件,每个文件中具有单独的查询类型,并使用 GraphQLQueryResolver 将这些查询类型映射到不同的 Java 组件。

My Spring Boot project structure

我有两个架构文件 A.graphqls 和 B.graphqls。

A.graphqls
---------------
type Person {
id: ID!,
name: String
}

type Query {
getPerson(id: Int):Person
}

type Mutation {
createPerson(name: String):Int
}

B.graphqls
---------------
type Book {
id: ID!,
title: String,
owner: Person
}

extend type Query {
getBooks(count: Int):[Book]
}

extend type Mutation {
deleteBook(id: Int):Int
}

schema {
query: Query,
mutation: Mutation
}

我将解释我学到的有关该主题需要遵循的规则的知识(我不保证这都是必要的,但这就是我设法让它按照我想要的方式工作的方法)。

  1. 这里的关键是只有一个模式定义。在哪个文件中(A.graphqls 或 B.graphqls 或 C.graphqls...)并不重要 - 例如,我将其添加到底部的 B.graphqls 文件中。

  2. 此外,一个文件中只能有一个“类型查询”定义。在所有其他架构文件中,您需要使用“扩展类型查询”来扩展该类型(是的,我知道,现在有意义......)。在哪个架构文件中,您对不相关的查询进行了主要定义。本段中的所有内容也适用于突变。

  3. 您可以在另一个 .graphqls 文件中使用一个 .graphqls 文件中定义的类型。它会得到认可。因此,在本例中,您可以在 B.graphqls 中使用 Person 类型引用。

Java 解析器:

import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import graphql.demo.model.Person;
import graphql.demo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class AQuery implements GraphQLQueryResolver {

@Autowired
private PersonService personService;

public Person getPerson(final int id) {
return this.personService.getPerson(id);
}
}

还有第二个...

@Component
public class BQuery implements GraphQLQueryResolver {

@Autowired
private BookService bookService;

public List<Book> getBooks(final int count) {
return this.bookService.getBooks(count);
}
}

此类的名称并不重要。我们也可以只有一个实现 GraphQLQueryResolver 的类,并且可以实现 A.graphqls 和 B.graphqls 文件中的所有查询方法(getBooks() 和 getPerson() 方法)。只要我们实现了所有方法,在哪个解析器类中实现它并不重要,graphql-java 会找到它。这同样适用于使用 GraphQLMutationResolver 的突变。

我的 github 上有完整的工作示例(MySQL、Spring Boot、React with Apollo client),所以你可以查看一下。还有用于生成项目中使用的数据库的mysql脚本。有很多表,但仅用于测试目的,重要的是我上面解释的文件结构和文件。如果您对客户端应用程序不感兴趣,当然可以使用 graphiql 进行测试。

https://github.com/dusko-dime/spring-react-graphql

希望这对某人有帮助,并感谢您再次帮助我:)

关于java - 将多个 graphQL 模式文件映射到单独的解析器 - Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60357247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com