canWrite uses actual return value type if known

Closes gh-22803
This commit is contained in:
Rossen Stoyanchev
2019-05-01 16:52:23 -04:00
parent 07c9a0e1f5
commit bd8d71be0e

View File

@@ -124,6 +124,7 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
Publisher<?> publisher;
ResolvableType elementType;
ResolvableType actualElementType;
if (adapter != null) {
publisher = adapter.toPublisher(body);
boolean isUnwrapped = KotlinDetector.isKotlinReflectPresent() &&
@@ -132,11 +133,12 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
!COROUTINES_FLOW_CLASS_NAME.equals(bodyType.toClass().getName());
ResolvableType genericType = isUnwrapped ? bodyType : bodyType.getGeneric();
elementType = getElementType(adapter, genericType);
actualElementType = elementType;
}
else {
publisher = Mono.justOrEmpty(body);
elementType = (bodyType.toClass() == Object.class && body != null ?
ResolvableType.forInstance(body) : bodyType);
actualElementType = body != null ? ResolvableType.forInstance(body) : bodyType;
elementType = (bodyType.toClass() == Object.class && body != null ? actualElementType : bodyType);
}
if (elementType.resolve() == void.class || elementType.resolve() == Void.class) {
@@ -151,7 +153,7 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
(publisher instanceof Mono ? "0..1" : "0..N") + " [" + elementType + "]");
}
for (HttpMessageWriter<?> writer : getMessageWriters()) {
if (writer.canWrite(elementType, bestMediaType)) {
if (writer.canWrite(actualElementType, bestMediaType)) {
return writer.write((Publisher) publisher, actualType, elementType,
bestMediaType, exchange.getRequest(), exchange.getResponse(),
Hints.from(Hints.LOG_PREFIX_HINT, logPrefix));