Мой пост сегодня касается моей попытки извлечения полей с помощью сборщика данных. Более конкретно, ошибка связана с исключением, которое возникает из поля executestrategy.fetch. Я просмотрел всю информацию в Интернете о возможном решении этой конкретной проблемы, однако ни один из опубликованных ответов не посвящен этой конкретной проблеме. Таким образом, мне интересно, если я должен изменить мою форматированную схему GraphQL SDL и написать ее программно, чтобы иметь возможность извлекать значения полей из схемы и в конечном итоге выполнить запрос GrapQL.
Журнал ошибок:
WARN [2018-09-10 15:38:50,143] graphql.execution.SimpleDataFetcherExceptionHandler: Exception while fetching data (/customer) : null
! java.lang.NullPointerException: null
! at co.vertabiz.api.customer.SingleCustomerDataFetcher.get(SingleCustomerDataFetcher.java:22)
! at co.vertabiz.api.customer.SingleCustomerDataFetcher.get(SingleCustomerDataFetcher.java:8)
! at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:258)
! at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:199)
! at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:70)
! at graphql.execution.Execution.executeOperation(Execution.java:158)
! at graphql.execution.Execution.execute(Execution.java:100)
! at graphql.GraphQL.execute(GraphQL.java:554)
! at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:496)
! at graphql.GraphQL.executeAsync(GraphQL.java:470)
! at graphql.GraphQL.execute(GraphQL.java:401)
! at graphql.servlet.GraphQLQueryInvoker.query(GraphQLQueryInvoker.java:92)
! at graphql.servlet.GraphQLQueryInvoker.query(GraphQLQueryInvoker.java:88)
! at graphql.servlet.GraphQLQueryInvoker.query(GraphQLQueryInvoker.java:39)
! at graphql.servlet.AbstractGraphQLHttpServlet.query(AbstractGraphQLHttpServlet.java:265)
! at graphql.servlet.AbstractGraphQLHttpServlet.lambda$new$0(AbstractGraphQLHttpServlet.java:87)
! at graphql.servlet.AbstractGraphQLHttpServlet.doRequest(AbstractGraphQLHttpServlet.java:236)
! at graphql.servlet.AbstractGraphQLHttpServlet.doRequestAsync(AbstractGraphQLHttpServlet.java:227)
! at graphql.servlet.AbstractGraphQLHttpServlet.doGet(AbstractGraphQLHttpServlet.java:252)
! at javax.servlet.http.HttpServlet.service(HttpServlet.java:686)
! at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
! at io.dropwizard.jetty.NonblockingServletHolder.handle(NonblockingServletHolder.java:49)
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)
! at io.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:35)
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
! at io.dropwizard.jersey.filter.AllowedMethodsFilter.handle(AllowedMethodsFilter.java:45)
! at io.dropwizard.jersey.filter.AllowedMethodsFilter.doFilter(AllowedMethodsFilter.java:39)
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
! at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1317)
! at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
! at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1219)
! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
! at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:239)
! at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:52)
! at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:724)
! at io.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:67)
! at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56)
! at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169)
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
! at org.eclipse.jetty.server.Server.handle(Server.java:531)
! at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352)
! at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
! at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281)
! at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
! at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:762)
! at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:680)
! at java.lang.Thread.run(Thread.java:748)
ERROR [2018-09-10 15:38:50,160] graphql.servlet.DefaultGraphQLErrorHandler: Error executing query (ExceptionWhileDataFetching): Exception while fetching data (/customer) : null
Итак, насколько я понимаю, эта ошибка исключения нулевого указателя связана с вызовом execute.ExecutionStrategy.fetchField родительского класса, который я перечислил в качестве примера SDL, приведенного ниже.
schema { query: Query }
type Query { customer (id: String) : Customer }
type Customer { firstName: String }
Я заметил, что большая часть документации GraphQL
создает схему в формате GraphQL SDL
, поэтому я сделал то же самое. Но после попытки отладки этой ошибки я начинаю думать, что должен написать ее программно. Причина в том, что я заметил, что http-запрос GET
вызывается, но затем прерывается ошибкой сборщика данных. Чтобы доказать это, установите операторы print в классе QueryResource, который печатает QueryParamater, который никогда не вызывается с момента возникновения исключения времени выполнения.
Я начинаю думать, что с моей схемой что-то не так, и, возможно, мне, возможно, потребуется написать ее программно, поскольку эта ошибка «fetchField» очень похожа на синтаксис, когда вы пишете схемы программно. Ниже также находится QueryResource :
Query Resource (GET request) class:
@path("/graphql")
@Produces(MediaType.TEXT_PLAIN)
public class QueryResource {
ExecutionResult executionResult;
private GraphQL graphql;
/*GETS HTTP REQUEST FROM SERVER
*retrieves and stores paramaterized value
*/
@GET
public List<Customer> runQuery(@QueryParam("query") String query) {
//http://localhost:9000/graphql?query={customer(id:%221%22){firstName}}
System.out.println("Query: " + query); //never executes
executionResult = graphql.execute(query); //never executes
List<GraphQLError> errors = executionResult.getErrors();
Object data = executionResult.getData();
System.out.println("DATA IS: " + data);
return (List<Customer>) data;
}
}
Сборщик данных в данный момент выглядит так, но я никогда не смогу getArgument(“id)
, так как ошибка времени выполнения возникает раньше.
public class SingleCustomerDataFetcher implements DataFetcher {
/*
* calls customer repository and retrieves data by customer id
*/
private CustomerRepository customerRepository;
@Override
public Customer get(DataFetchingEnvironment environment) {
System.out.println("IN SINGLE CUSTOMER DATAFETCHER");
String id = environment.getArgument("id"); //never executes
return customerRepository.findCustomer(id); //never executes
}
}
Я действительно ценю ваше понимание. :)
Заранее спасибо,
Alvaro