Browse Source

Improve Object return type support in WebFlux

Issue: SPR-15731
pull/1468/merge
Rossen Stoyanchev 8 years ago
parent
commit
f7478446b7
  1. 15
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java
  2. 11
      spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java

15
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageWriterResultHandler.java

@ -96,7 +96,8 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa @@ -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 @@ -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<MediaType> getProducibleMediaTypes(ResolvableType elementType) {
return getMessageWriters().stream()
.filter(converter -> converter.canWrite(elementType, null))

11
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java

@ -137,6 +137,12 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq @@ -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 @@ -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<Person> getSingle() {
return Single.just(new Person("Robert"));

Loading…
Cancel
Save