在一个schema上执行查询,需要首先创建一个GraphQL
对象,然后调用该对象的execute()
方法
GraphQL在执行结束后返回一个ExecutionResult
对象,其中包含查询的数据(data字段)或错误信息(errors字段)。
GraphQLSchema schema = wSchema().query(queryType).build();GraphQL graphQL = wGraphQL(schema).build();ExecutionInput executionInput = wExecutionInput().query("query { hero { name } }").build();ExecutionResult executionResult = ute(executionInput);Object data = Data();List<GraphQLError> errors = Errors();
每个GraphQL中的field(字段)都会绑定一个DataFetcher。在其他的GraphQL实现中,也称DataFetcher为Resolver。
一般,我们可以使用PropertyDataFetcher对象,从内存中的POJO对象中提取field的值。如果你没有为一个field显式指定一个DataFetcher,那么GraphQL默认会使用PropertyDataFetcher与该field进行绑定。
但对于最顶层的领域对象(domain object)查询来说,你需要定义一个特定的data fetcher。顶层的领域对象查询,可能会包含数据库操作,或通过HTTP协议与其他系统进行交互获得相应数据。
GraphQL - Java并不关心你是如何获取领域对象数据的,这是业务代码中需要考虑的问题。它也不关心在获取数据时需要怎样的认证方式,你需要在业务层代码中实现这部分逻辑。
一个简单的Data Fetcher示例如下:
DataFetcher userDataFetcher = new DataFetcher() {@Overridepublic Object get(DataFetchingEnvironment environment) {return Argument("userId"));}};
每个DataFetcher的方法中,都会传入一个DataFetchingEnvironment对象。这个对象中包含了当前正在被请求的field,field所关联的请求参数argument,以及其他信息(例如,当前field的上层field、当前查询的root对象或当前查询的context对象等)。
在上面的例子中,GraphQL会在data fetcher返回执行结果前一直等待,这是一种阻塞的调用方式。也可以通过返回data相关的CompletionStage对象,将DataFetcher的调用异步化,实现异步调用。
如果在GraphQL的DataFetcher执行过程中产生了异常,在GraphQL的执行策略下, 将生成一个ExceptioinWhileDataFetching错误对象,并将它添加到返回的ExecutionResult对象的errors列表字段当中。GraphQL允许返回部分成功的数据,并带上异常信息。
正常的异常处理逻辑如下:
public class SimpleDataFetcherExceptionHandler implements DataFetcherExceptionHandler {private static final Logger log = Logger(SimpleDataFetcherExceptionHandler.class);@Overridepublic void accept(DataFetcherExceptionHandlerParameters handlerParameters) {Throwable exception = Exception();SourceLocation sourceLocation = Field().getSourceLocation();ExecutionPath path = Path();ExceptionWhileDataFetching error = new ExceptionWhileDataFetching(path, exception, sourceLocation);ExecutionContext().addError(error);log.Message(), exception);}}
如果抛出的异常是一个GraphqlError对象,那么它会将异常信息和扩展属性
本文发布于:2024-01-31 09:31:18,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170666467927548.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |