2017-02-04 2 views
4

Ich weiß, wie retrieve a bean from a service in a datafetcher:GraphQL Java: Mit @Batched DataFetcher

public class MyDataFetcher implements DataFetcher { 
    ... 

    @Override 
    public Object get(DataFetchingEnvironment environment) { 
    return myService.getData(); 
    } 
} 

Aber Schemata mit verschachtelten Listen sollte eine BatchedExecutionStrategy verwenden und dosiert DataFetchers mit get() Methoden kommentieren @Batched (see graphql-java doc) zu erstellen.

Aber wo gebe ich dann meine getData() -Aufruf?

///// 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? 
    } 
} 

Antwort

2

Schau es dir so an. Normal DataFetchers s erhalten ein einzelnes Objekt als Quelle (DataFetchingEnvironment#getSource) und geben als Ergebnis ein einzelnes Objekt zurück. Zum Beispiel hatten, wenn Sie eine Abfrage wie:

Ihren company Resolver (Abholer) würde ein User Objekt als Quelle erhalten, und zu erwarten, irgendwie ein Company an diesem Beispiel basierte zurückkehren

User owner = (User) environment.getSource(); 
Company company = companyService.findByOwner(owner); 
return company; 

nun in der exakt gleichen Szenario, wenn Ihr DataFetcher chargiert wurde, und Sie verwendet BatchedExecutionStrategy, anstelle eines User empfängt und ein Company Rückkehr, würden Sie einen List<User> erhalten und würde eine List<Company> stattdessen zurück.

z.

List<User> owners = (List<User>) environment.getSource(); 
List<Company> companies = companyService.findByOwners(owners); 
return companies; 

Beachten Sie, dass dies bedeutet, dass Ihre zugrunde liegende Logik, einen Weg, um mehrere Dinge zu holen haben müssen, sonst wäre es nicht chargiert werden. Ihr myService.getData Aufruf müsste sich also ändern, es sei denn, es kann bereits Daten für mehrere Quellobjekte auf einmal abrufen.

Beachten Sie auch, dass die Batch-Auflösung nur in verschachtelten Abfragen sinnvoll ist, da der Resolver auf oberster Ebene bereits eine Objektliste abrufen kann, ohne dass eine Stapelverarbeitung erforderlich ist.