我解决了它,我应该更仔细地阅读graphql-java-
tools库的文档。除了,
GraphQLQueryResolver它可以解决基本查询
GraphQLResolver<T>,我的
Show课程也需要一个,如下所示:
@Componentpublic class ShowResolver implements GraphQLResolver<Show> { @Autowired private CompetitionRepository competitionRepository; public List<Competition> competitions(Show show) { return ((List<Competition>)competitionRepository.findByShowId(show.getId())); }}这告诉库如何解析
Show类中的复杂对象,并且仅在最初查询请求包含
Competition对象时才使用。新年快乐!
编辑31.07.2019
:从那以后我就离开了下面的解决方案。长时间运行的事务很少是一个好主意,在这种情况下,一旦扩展应用程序,可能会导致问题。我们开始实现DataLoader以在异步事件中批处理查询。长时间运行的事务与DataLoader的异步性质相结合,可能导致死锁:https :
//github.com/graphql-java-kickstart/graphql-java-
tools/issues/58#issuecomment-398761715(针对以下内容,更多信息)。我不会删除下面的解决方案,因为对于较小的应用程序和/或不需要任何批处理查询的应用程序,它仍然可能是一个很好的起点,但是在执行此操作时请记住此注释。
编辑: 根据要求,这里是使用自定义执行策略的另一种解决方案。我正在使用
graphql-spring-boot-starter和
graphql-java-tools:
我首先定义一个GraphQL Config,如下所示:
@Configurationpublic class GraphQLConfig { @Bean public Map<String, ExecutionStrategy> executionStrategies() { Map<String, ExecutionStrategy> executionStrategyMap = new HashMap<>(); executionStrategyMap.put("queryExecutionStrategy", new AsyncTransactionalExecutionStrategy()); return executionStrategyMap; }}其中
AsyncTransactionalExecutionStrategy的定义如下:
@Servicepublic class AsyncTransactionalExecutionStrategy extends AsyncExecutionStrategy { @Override @Transactional public CompletableFuture<ExecutionResult> execute(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException { return super.execute(executionContext, parameters); }}这将整个查询执行置于同一事务中。我不知道这是否是最佳的解决方案,并且在错误处理方面也已经存在一些缺点,但是您不必以这种方式定义类型解析器。



