Skip to content

Support Query Results with several layers of generics #3717

Description

@smcvb

Feature Description

Due to the shift to the MessageStream, we are inclined to unwrap all results from @MessageHandler annotated methods into MessageStreams.
Although most cases work, whenever we're faced with several layers of generics we hit predicaments.
There are roughly two scenarios of this that are annoying, which I'll explain shortly:

Single-entry MessageStream result while it should be a multi-entry variant

If a @QueryHandler annotated method returns the following, conversion exceptions will be thrown:

// Test example from the FutureAsResponseTypeToQueryHandlersTest class
@QueryHandler(queryName = "myQueryWithMultipleResponses")
public CompletableFuture<List<String>> queryHandler(String criteria) {
    CompletableFuture<List<String>> completableFuture = new CompletableFuture<>();
    executor.schedule(() -> completableFuture.complete(asList("Response1", "Response2")),
                      FUTURE_RESOLVING_TIMEOUT,
                      TimeUnit.MILLISECONDS);
    return completableFuture;
}

This has to do with the fact that the current behavior spots a CompletableFuture, assuming a single entry MessageStream will suffices. Whereas in fact, we are dealing with a collection and thus a multi-entry MessageStream should be returned.

Wrapping a Message in another Message

If a @QueryHandler annotated method returns the following, unexpected Message#payload outcomes will be returned:

@QueryHandler
public Mono<Message> queryHandler(String criteria) {
    return Mono.just(new GenericMessage(new MessageType("my-response"), "response));
}

This has to do with how the MessageStreamResolverUtils currently maps the contained object.
If a Mono/Flux/CompletableFuture/etc is given, we assume the contained object to not be a Message.
By simply checking if that's a Message instance, we can deal with this differently.


Given these are edge cases for annotated query handlers, we have marked this work to be resolved later. We do not deem supporting this to incur breaking changes to any APIs.

When picking up this issue, be sure to resolve any todos referring to this issue's issue number.

Current Behaviour

Message handlers returning responses with several generics deep may not get resolved to the expected MessageStream.

Wanted Behaviour

Message handlers returning responses with several generics deep are resolved to the expected MessageStream.

Possible Workarounds

Not use query handlers with several generics deep.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority 3: CouldLow priority. Issues that are nice to have but have a straightforward workaround.

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions