我在我的Spring应用程序中使用了graphql-java和graphql-java-annotations(spring-graphql-common看起来非常有限,看起来它不再被维护),并且我正在努力处理子字段。GraphQL +爪哇 - 如何过滤子域?
我有两个类A
和B
,我想用GraphQL访问,在这里,他们是:
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 in listOfB字段与@GraphQLDataFetcher一起?我在这里做一些测试并且工作。 – Sigrist
噢,对不起,它仍然是DataFetcher的'GraphQLField'。但是我仍然遇到同样的错误。我设法通过将'listOfB'定义为方法而不是字段来实现它,但它最终成为了单调乏味的方式,所以我正在编写自定义注释以允许在任何字段上自动过滤,只需添加一个'@ GraphQLAnnotation'注释。 – AntoineB