GraphQL Java:使用@Batched DataFetcher

时间:2017-02-04 14:16:07

标签: graphql graphql-java

我知道如何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?
  }
}

1 个答案:

答案 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调用需要更改,除非它已经可以一次性获取多个源对象的数据。

另请注意,批量分辨率仅在嵌套查询中有意义,因为顶级解析器已经可以获取对象列表,而无需批处理。