【发布时间】:2020-06-06 23:32:48
【问题描述】:
我发现很难将查询从一个模式文件中分离出来。我想要这样的东西:
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 解析器文件?
【问题讨论】:
-
您的项目是否使用单个 graphqls 文件?如果没有,你应该先确保它。
-
是的,如果我将所有查询放在一个模式文件中,并且我只保留一个包含所有必需方法的 GraphQLQueryResolver,它就可以工作。我发现与该主题相关的文档和示例很少。所有示例通常都集中在一个模式文件上。在两个模式文件上找不到任何东西,我认为能够在多个模式文件上拆分查询非常有用。项目可能会变得非常大,将它们全部保存在一个架构文件中并不方便。
-
您说它适用于一个模式文件和一个大解析器,但它适用于一个模式文件和几个小解析器吗?这就是我的graphql项目的设置方式,所以我们应该能够做到这一点。从日志来看,graphql-java-tools 似乎正在解析您的 graphqls 文件,但找不到您的 HouseQuery 解析器。
-
@DulleX 你找到解决方案了吗?我遇到了类似的问题。
-
@Saloo 不幸的是,不。我只是用 Spring 研究 graphql,几天后我放弃了,因为我无法让它与更多的模式文件和更多的解析器一起工作,我可以'没有理由深入了解它,因为我认为,在较大的项目中,使用一个模式文件和一个解析器是不可能进行代码维护的。
标签: java graphql graphql-java