-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
If there is a type mismatch for the value on a subscription, the result comes back with null values and no errors. For example, here "greetings" is [String] but the DataFetcher returns String:
@Test
void subscription() throws Exception {
String query = "subscription Greeting { greetings }";
String schema = "type Subscription { greetings: [String] } type Query { greeting: String }";
RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
.type("Subscription", builder -> builder.dataFetcher("greetings", env -> Flux.just("hi", "hiya")))
.build();
GraphQLSchema graphQLSchema = new SchemaGenerator().makeExecutableSchema(new SchemaParser().parse(schema), wiring);
GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();
ExecutionResult result = graphQL.executeAsync(ExecutionInput.newExecutionInput(query).build()).get();
System.out.println("Errors: " + result.getErrors());
CountDownLatch latch = new CountDownLatch(1);
result.<Publisher<ExecutionResult>>getData()
.subscribe(new Subscriber<ExecutionResult>() {
@Override
public void onSubscribe(Subscription subscription) {
subscription.request(Long.MAX_VALUE);
}
@Override
public void onNext(ExecutionResult result) {
System.out.println("Errors: " + result.getErrors() + ", Data: " + result.getData());
}
@Override
public void onError(Throwable ex) {
System.out.println("[onError]: " + ex);
}
@Override
public void onComplete() {
latch.countDown();
}
});
latch.await();
}The output is:
Errors: []
Errors: [], Data: {greetings=null}
Errors: [], Data: {greetings=null}
By comparison, for a regular query the same is reported as a TypeMismatchError:
@Test
void query() throws Exception {
String query = "{ greeting }";
String schema = "type Query { greeting: [String] }";
RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
.type("Query", builder -> builder.dataFetcher("greeting", env -> "hi"))
.build();
GraphQLSchema graphQLSchema = new SchemaGenerator().makeExecutableSchema(new SchemaParser().parse(schema), wiring);
GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();
ExecutionResult result = graphQL.executeAsync(ExecutionInput.newExecutionInput(query).build()).get();
System.out.println("Errors: " + result.getErrors());
System.out.println("Data: " + result.getData());
}The output is:
Errors: [TypeMismatchError{path=[greeting], expectedType=[String]}]
Data: {greeting=null}
Not sure if this is expected behavior or not, but the error seems to be silently absorbed, not even TRACE logging shows anything.
Metadata
Metadata
Assignees
Labels
No labels