From f7478446b704b19783360ed65f85cfbab6b6a8d4 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 4 Jul 2017 08:18:51 -0400 Subject: [PATCH] Improve Object return type support in WebFlux Issue: SPR-15731 --- .../AbstractMessageWriterResultHandler.java | 15 ++++++++++++++- ...tMappingMessageConversionIntegrationTests.java | 11 +++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java index 6cc438907a..b73523acf2 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java @@ -96,7 +96,8 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa ResolvableType elementType; if (adapter != null) { publisher = adapter.toPublisher(body); - elementType = adapter.isNoValue() ? ResolvableType.forClass(Void.class) : bodyType.getGeneric(0); + ResolvableType genericType = bodyType.getGeneric(0); + elementType = getElementType(adapter, genericType); } else { publisher = Mono.justOrEmpty(body); @@ -127,6 +128,18 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa return Mono.error(new NotAcceptableStatusException(getProducibleMediaTypes(elementType))); } + private ResolvableType getElementType(ReactiveAdapter adapter, ResolvableType genericType) { + if (adapter.isNoValue()) { + return ResolvableType.forClass(Void.class); + } + else if (genericType != ResolvableType.NONE) { + return genericType; + } + else { + return ResolvableType.forClass(Object.class); + } + } + private List getProducibleMediaTypes(ResolvableType elementType) { return getMessageWriters().stream() .filter(converter -> converter.canWrite(elementType, null)) diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java index 5aeb7b0766..ef9212cf14 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java @@ -137,6 +137,12 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq assertEquals(expected, performGet("/person-response/mono", JSON, Person.class).getBody()); } + @Test + public void personResponseBodyWithMonoDeclaredAsObject() throws Exception { + Person expected = new Person("Robert"); + assertEquals(expected, performGet("/person-response/mono-declared-as-object", JSON, Person.class).getBody()); + } + @Test public void personResponseBodyWithSingle() throws Exception { Person expected = new Person("Robert"); @@ -442,6 +448,11 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq return Mono.just(new Person("Robert")); } + @GetMapping("/mono-declared-as-object") + public Object getMonoDeclaredAsObject() { + return Mono.just(new Person("Robert")); + } + @GetMapping("/single") public Single getSingle() { return Single.just(new Person("Robert"));