【发布时间】:2017-03-08 11:14:56
【问题描述】:
我在我的 Spring 应用程序中使用 graphql-java 和 graphql-java-annotations(spring-graphql-common 似乎非常有限,并且看起来不再维护),并且我正在努力处理子字段操作。
我想使用 GraphQL 访问两个类 A 和 B,它们是:
class A {
@GraphQLField
Integer id;
@GraphQLField
String name;
@GraphQLField
List<B> listOfB;
}
class B {
@GraphQLField
Integer id;
@GraphQLField
String code;
}
我可以使用以下模式成功查询A 中的所有字段以及B 中的字段:
@Component
public class Schema
{
public GraphQLObjectType aType;
public GraphQLSchema aSchema;
public GraphQLObjectType queryType;
@Autowired
public Schema(DataFetcher dataFetcher) throws IllegalAccessException, InstantiationException, NoSuchMethodException
{
aType = GraphQLAnnotations.object(A.class);
queryType =
GraphQLObjectType
.newObject()
.name("QueryType")
.field(GraphQLFieldDefinition.newFieldDefinition()
.name("a")
.type(aType)
.argument(GraphQLArgument.newArgument()
.name("id")
.type(new GraphQLNonNull(Scalars.GraphQLInt))
.build())
.dataFetcher(dataFetcher)
.build())
.build();
aSchema = GraphQLSchema.newSchema()
.query(queryType)
.build();
}
}
我可以通过以下请求成功过滤a:
{
a(id:5)
{
id,
name,
listOfB
{
code
}
}
}
但是当我尝试过滤 listOfB 时,例如使用 take 以仅选择 X 记录时,出现错误 Validation error of type UnknownArgument: Unknown argument take:
{
a(id:5)
{
id,
name,
listOfB(take:3)
{
code
}
}
}
我理解错误的含义,因为我没有为A 上的listOfB 字段声明任何可能的参数,但我不知道如何使用graphql-java-annotations 来做到这一点。
我已经为listOfB 添加了一个特定的DataFetcher,在A 类中使用以下代码:
@GraphQLDataFetcher(BDataFetcher.class)
private List<B> listOfB;
当我检索到listOfB 时,它确实被调用了。
您知道如何在使用graphql-java-annotations 时向字段添加参数吗?如果没有,有什么解决方法吗?
定义不带注释的架构并使用graphql-java 的“经典”方式不是一种选择,因为我的架构非常庞大:/
谢谢:)
【问题讨论】:
-
您是否尝试将@GraphQLField 与@GraphQLDataFetcher 一起添加到listOfB 字段中?我在这里做了一些测试并且工作了。
-
哦,是的,很抱歉,它仍然是带有 DataFetcher 的
GraphQLField。但我仍然遇到同样的错误。我设法通过将listOfB定义为方法而不是字段来使其工作,但它最终变得乏味,所以我目前正在编写自定义注释以允许仅通过添加@GraphQLAnnotation注释在任何字段上自动过滤就可以了。 -
我有类似的问题,你能帮帮我吗? stackoverflow.com/questions/66790053/…
标签: java annotations graphql graphql-java