DGS Netflix Graphql 中的控制器

问题描述

我们正在开发一个使用 Spring boot 和 DGS Netflix graphql 的项目。我们创建了所有模式和数据链,它们在认端点“/graphql”下完全正常工作。我们想使用自定义端点公开此应用程序,因此我们尝试添加具有自定义端点的控制器,如下所示。但是当我运行应用程序并发送查询时,我的数据提取器被调用了两次。第一次从控制器调用,第二次我相信框架本身。任何人对此有任何想法,为什么它被调用两次以及如何避免它?非常感谢您的帮助。请参阅下面的 Datafetcher 和 Controller。

Controller:

@RestController
@RequestMapping("/sample-information/model")
@Slf4j
public class CustomController {
    
    @Autowired
    DgsQueryExecutor dgsQueryExecutor;

    
    @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE,"application/graphql"})
    public Mono<ResponseEntity<Object>> getDetails(@RequestBody String query,@RequestHeader HttpHeaders headers
            ) {
        GraphQLQueryInput inputs = null;
        try {
            inputs = ObjectMapperHelper.objectMapper.readValue(query,GraphQLQueryInput.class);
        } catch (Exception e) {
            log.error("TraceId: {} - Application Error: Error message: Error converting query to GraphQLQueryInput: {} "+ query);
            
        }
        
        if(inputs.getvariables() == null) {
            inputs.setvariables(new HashMap<>());
        }
        
        if(inputs.getoperationName() == null) {
            inputs.setoperationName("");
        }
        
        final String que = inputs.getQuery();
        final Map<String,Object> var = inputs.getvariables();
        final String opn = inputs.getoperationName();
        
        ExecutionInput.Builder executionInput = ExecutionInput.newExecutioninput()
                .query(inputs.getQuery())
                .operationName(inputs.getoperationName())
                .variables(inputs.getvariables());
        
       return Mono.fromCallable(()-> {
            return dgsQueryExecutor.execute(que,var,opn);
        }).subscribeOn(Schedulers.elastic()).map(result -> {
            return new ResponseEntity<>(result,HttpStatus.OK); 
        }); 
    }

}

Datafetcher:

@DgsComponent
@Slf4j
public class SampleDataFetcher {
    @Autowired
    SampleBuilder sampleBuilder;
    
    @DgsData(parentType = DgsConstants.QUERY_TYPE,field = DgsConstants.QUERY.SampleField)
    public CompletableFuture<StoreDirectoryByStateResponse> getStoreDirectoryByState(@InputArgument String state,DataFetchingEnvironment dfe) throws BadRequestException {

        Mono<StoreDirectoryByStateResponse> storeDirectoryResponse = null;
        try {
            sampleResponse = sampleBuilder.buildresponse(modelGraphQLContext);
        } catch (BaseException e) {

        }
        return sampleResponse.map(response -> {
            return response;
        }).toFuture();
        
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)