我知道如何retrieve a bean from a service in a datafetcher:
public class MyDataFetcher implements DataFetcher {
...
@Override
public Object get(DataFetchingEnvironment environment) {
return myService.getData();
}
}
但是具有嵌套列表的模式应该使用BatchedExecutionStrategy并使用注释@Batched(see graphql-java doc)的get()方法创建批量DataFetchers。
但是我在哪里调用getData()呢?
///// Where to put this code?
List list = myService.getData();
/////
public class MyDataFetcher implements DataFetcher {
@Batched
public Object get(DataFetchingEnvironment environment) {
return list.get(environment.getIndex()); // where to get the index?
}
}
答案 0 :(得分:4)
警告: BatchedExecutionStrategy
已弃用超过6个月且将被删除。目前首选的解决方案是Data Loader library。此外,整个执行引擎将来会被替换,而新的执行引擎将再次支持批处理"本地"。
这样看。普通DataFetchers
接收单个对象作为源(DataFetchingEnvironment#getSource
)并返回单个对象作为结果。例如,如果您有类似的查询:
{
user (name: "John") {
company {
revenue
}
}
您的company
解析器(抓取器)将获得一个User
对象作为源,并且可能会以某种方式返回Company
,例如
User owner = (User) environment.getSource();
Company company = companyService.findByOwner(owner);
return company;
现在,在完全相同的情况下,如果您的DataFetcher
已经过批量处理,并且您使用了BatchedExecutionStrategy
,而不是收到User
并返回Company
,那么您就是# 39; d收到List<User>
,然后返回List<Company>
。
E.g。
List<User> owners = (List<User>) environment.getSource();
List<Company> companies = companyService.findByOwners(owners);
return companies;
请注意,这意味着您的基础逻辑必须能够同时获取多个内容,否则它不会被批处理。因此,您的myService.getData
调用需要更改,除非它已经可以一次性获取多个源对象的数据。
另请注意,批量分辨率仅在嵌套查询中有意义,因为顶级解析器已经可以获取对象列表,而无需批处理。