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

将多个graphQL架构文件映射到单独的解析器-Spring Boot

霍弘厚
2023-03-14

我发现从一个模式文件中分离查询非常困难。我想要这样的东西:

汽车graphqls

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

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

房屋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工具包将搜索整个项目并找到所有模式文件(以.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解析器文件的模式文件?

共有3个答案

章承
2023-03-14

此外,解析程序名称可能存在问题。请确保指定与GraphQL架构中定义的解析程序方法相同的名称

洪飞龙
2023-03-14

graphqljava工具将找到所有的。graphqls文件来构建架构实例。多个架构文件可以开箱即用。

每个解析器组件必须实现GraphQLQueryResolverGraphQLMutationResolver,并且可以通过spring boot进行扫描。确保它有一个@Component注释,并且位于spring@ComponentScan基本包中。

未找到具有以下任何签名的方法表示graphql工具无法找到具有与签名匹配的方法的解析器组件。在本例中,HouseQuery解析器缺少@Component注释。

羊舌航
2023-03-14

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

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

我的Spring Boot项目结构

我有两个模式文件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
}

我将解释我所学到的关于这个主题需要遵循的规则的知识(我不能保证这一切都是必要的,但这就是我如何使它工作的方式,我希望它工作的方式)。

>

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

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

    您可以使用在其中定义的类型。其他文件中的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客户端),所以你可以查看一下。还有mysql脚本用于生成项目中使用的数据库。有很多表,但只是为了测试目的,重要的是我上面解释的文件结构和文件。如果你对客户端应用程序不感兴趣,你当然可以使用Graphhiql来测试它。

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

    希望这能对某人有所帮助,并再次感谢你对我的帮助:)

  •  类似资料:
    • 问题内容: 是否可以配置Hibernate将组件类存储在单独的表中? 请看以下示例: 这映射到一个具有两列和的表。我想要的是将组件的属性映射到名为的表。 我 不 希望做的是配置在本身(它有没有意义的身份之外的实体),所以排除了正常的关联。另外,我无法修改对象模型(它是生成的代码),因此不能向引入ID属性。 这似乎是Hibernate功能上的一个空白- 映射执行“多个类到一个表”,而 执行“一个类到

    • 如果要在Spring MVC应用程序中使用多视图解析程序,则可以使用order属性设置优先级顺序。 以下示例显示如何在Spring Web MVC框架中使用ResourceBundleViewResolver和InternalResourceViewResolver 。 TestWeb-servlet.xml <bean class = "org.springframework.web.servl

    • 我有一个pojo类,我在其中使用Hibernate注释。在我的数据库中,我有两个模式相似的表。我想知道在hibernate注释中是否有任何方法可以将同一个pojo类用于这两个表。请告诉我怎么做。

    • 我有一个自己的nginx配置由脚本生成。除了之外,我更喜欢将其放在下 顺便说一句:我在和上使用minikube

    • 我正在spring应用程序中使用graphql java工具。我有这样一个实体: 在GraphQL模式中,我想要一个不同的类型: 当然,由于模式解析异常,启动此操作将不起作用。所以我认为在模式解析之间放置一些东西来实现从到的映射是可能的。 这有可能吗? 编辑 抱歉,它不会给出架构解析异常。它将简单地将字节放入字符串中。但是我不能用这个字符串来创建图像。 澄清 对不起,我想我的问题还不够清楚。我不需

    • 使用Kafka流DSL是否可行?所有正在使用的主题都是,因此我希望模拟一个表,并且永远不要摆脱旧的值。 TL;DR;如何将一条消息转换成多条消息?