-
Notifications
You must be signed in to change notification settings - Fork 329
Description
When an @SchemaMapping annotated controller method has a parameter that is annotated with @ContextValue and whose type is Mono, it will be called with null when the corresponding value in the GraphQLContext is an empty Mono.
When the GraphQLContext contains a mapping from value to Mono.empty(), the below code will throw an NPE:
@QueryMapping("SomeField")
fun someField(@ContextValue value: Mono<SomeContextType>) = value.map { ... }I believe the cause is in InvocableHandlerMethodSupport.toArgsMono(Object[] args). This code replaces empty Mono instances in the generated arguments list with null if they are empty. This works fine for unwrapping Mono values stored in the GraphQLContext for an annotated controller with a @ContextValue parameter whose type is the Mono's element type, such as a Mono<String> value in the context to a String (or null) parameter value, but is an issue with a Mono parameter type since it gets invoked with null.
Edit:
This is the code that replaced the empty Mono with null regardless of the @ContextValue parameter type:
protected Mono<Object[]> toArgsMono(Object[] args) {
List<Mono<Object>> monoList = Arrays.stream(args)
.map(arg -> {
Mono<Object> argMono = (arg instanceof Mono ? (Mono<Object>) arg : Mono.justOrEmpty(arg));
return argMono.defaultIfEmpty(NO_VALUE);
})
.collect(Collectors.toList());
return Mono.zip(monoList,
values -> Stream.of(values).map(value -> value != NO_VALUE ? value : null).toArray());
}