У меня есть проект в java 8
в настоящее время.
Если я использую только:
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>5.0.2</version>
</dependency>
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>4.0.0</version> <!--5.0.2 http://localhost:8999/graphiql fails to load-->
</dependency>
И у меня есть такая схема:
type Query {
getAllItems: [TestEntity]
getItem(dictionaryType: String): TestEntity
}
type TestEntity {
code: String!
name: String
description: String
dictionaryType: String
}
1) Ииметь resolver
как:
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class QueryResolver implements GraphQLQueryResolver {
@Autowired
private final DictionaryService dictionaryService;
public List<TestEntity> getAllItems() {
return dictionaryService.getAllDictionaryItemsAsStrings();
}
public TestEntity getItem(String dictionaryType) {
return dictionaryService.getDictionaryItemsFirstAsString(dictionaryType);
}
}
Если я запрашиваю two
ресурсов сразу:
query {
getAllItems {
code
description
}
getItem(dictionaryType: "test1") {
code
name
description
}
}
Выполняет ли getItem
и getAllItems
выполнение asynchronusly
/ parralel
/ concurrently
или задача выполняется одна за другой?
2) Если мы изменим наш код с той же схемой, но без реализации `resolvers, вот так:
@RestController
@PreAuthorize("isAuthenticated()")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class GraphqlController {
private final DictionaryService dictionaryService;
private DataFetcher<List<TestEntity>> allDictionaryItemsFetcher;
private DataFetcher<TestEntity> dictionaryItemFetcher;
@Value("classpath:test-resolvers.graphqls")
private Resource schemaResource;
private GraphQL graphQL;
@PostConstruct
private void loadSchema() throws IOException {
File schemaFile = schemaResource.getFile();
TypeDefinitionRegistry registry = new SchemaParser().parse(schemaFile);
RuntimeWiring wiring = buildWiring();
GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, wiring);
graphQL = GraphQL.newGraphQL(schema).build();
}
private void initializeFetchers() {
allDictionaryItemsFetcher = dataFetchingEnvironment -> dictionaryService.getAllDictionaryItemsAsStrings();
dictionaryItemFetcher = dataFetchingEnvironment ->
dictionaryService.getDictionaryItemsFirstAsString(dataFetchingEnvironment.getArgument("dictionaryType"));
}
private RuntimeWiring buildWiring() {
initializeFetchers();
return RuntimeWiring.newRuntimeWiring()
.type("Query", typeWriting -> typeWriting
.dataFetcher("getAllItems", allDictionaryItemsFetcher)
.dataFetcher("getItem", dictionaryItemFetcher)
)
.build();
}
@PostMapping("graphql")
public ResponseEntity<Object> getResource(@RequestBody Map<String, Object> request) {
ExecutionResult result;
String query = request.get("query").toString();
Map<String, Object> variables = (Map<String, Object>) (request).get("variables");
ExecutionInput input = ExecutionInput.newExecutionInput()
.query(query)
.variables(variables)
.context(SecurityContextHolder.getContext().getAuthentication())
.build();
result = graphQL.execute(input);
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
Это, вероятно, не работает асинхронно, потому что нам нужно использовать, например, CompletableFuture
.Я не уверен, как изменить этот код на asynchronous
/ concurrently
/ parralel
, если кто-то тоже хотел бы сделать то, что я должен сделать, чтобы сделать это таким образом, я был бы рад.Заранее спасибо!
РЕДАКТИРОВАТЬ:
В примере 2)
я мог бы написать что-то вроде:
@PostMapping("graphql")
public DeferredResult<ResponseEntity<?>> handleReqDefResult(@RequestBody Map<String, Object> request) throws ExecutionException, InterruptedException {
DeferredResult<ResponseEntity<?>> output = new DeferredResult<>();
CompletableFuture<ExecutionResult> result;
String query = request.get("query").toString();
Map<String, Object> variables = (Map<String, Object>) (request).get("variables");
ExecutionInput input = ExecutionInput.newExecutionInput()
.query(query)
.variables(variables)
.context(SecurityContextHolder.getContext().getAuthentication())
.build();
result = graphQL.executeAsync(input);
output.setResult(ResponseEntity.ok(result.get()));
return output;
}