ResponseEntity declared as Object in WebFlux controller
Issue: SPR-15785
This commit is contained in:
@@ -92,15 +92,18 @@ public class HandlerResult {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the type of the value returned from the handler.
|
||||
* Return the type of the value returned from the handler -- e.g. the return
|
||||
* type declared on a controller method's signature. Also see
|
||||
* {@link #getReturnTypeSource()} to obtain the underlying
|
||||
* {@link MethodParameter} for the return type.
|
||||
*/
|
||||
public ResolvableType getReturnType() {
|
||||
return this.returnType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link MethodParameter} from which
|
||||
* {@link #getReturnType() returnType} was created.
|
||||
* Return the {@link MethodParameter} from which {@link #getReturnType()
|
||||
* returnType} was created.
|
||||
*/
|
||||
public MethodParameter getReturnTypeSource() {
|
||||
return (MethodParameter) this.returnType.getSource();
|
||||
|
||||
@@ -80,7 +80,8 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand
|
||||
|
||||
@Override
|
||||
public boolean supports(HandlerResult result) {
|
||||
if (isSupportedType(result.getReturnType().getRawClass())) {
|
||||
Class<?> valueType = resolveReturnValueType(result);
|
||||
if (isSupportedType(valueType)) {
|
||||
return true;
|
||||
}
|
||||
ReactiveAdapter adapter = getAdapter(result);
|
||||
@@ -88,6 +89,16 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand
|
||||
isSupportedType(result.getReturnType().getGeneric().resolve(Object.class));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Class<?> resolveReturnValueType(HandlerResult result) {
|
||||
Class<?> valueType = result.getReturnType().getRawClass();
|
||||
Object value = result.getReturnValue();
|
||||
if ((valueType == null || valueType.equals(Object.class)) && value != null) {
|
||||
valueType = value.getClass();
|
||||
}
|
||||
return valueType;
|
||||
}
|
||||
|
||||
private boolean isSupportedType(@Nullable Class<?> clazz) {
|
||||
return (clazz != null && HttpEntity.class.isAssignableFrom(clazz) &&
|
||||
!RequestEntity.class.isAssignableFrom(clazz));
|
||||
|
||||
@@ -120,6 +120,11 @@ public class ResponseEntityResultHandlerTests {
|
||||
|
||||
returnType = on(TestController.class).resolveReturnType(CompletableFuture.class, entity(String.class));
|
||||
assertTrue(this.resultHandler.supports(handlerResult(value, returnType)));
|
||||
|
||||
// SPR-15785
|
||||
value = ResponseEntity.ok("testing");
|
||||
returnType = on(TestController.class).resolveReturnType(Object.class);
|
||||
assertTrue(this.resultHandler.supports(handlerResult(value, returnType)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -190,6 +195,9 @@ public class ResponseEntityResultHandlerTests {
|
||||
MethodParameter returnType = on(TestController.class).resolveReturnType(entity(String.class));
|
||||
testHandle(returnValue, returnType);
|
||||
|
||||
returnType = on(TestController.class).resolveReturnType(Object.class);
|
||||
testHandle(returnValue, returnType);
|
||||
|
||||
returnValue = Mono.just(ok("abc"));
|
||||
returnType = on(TestController.class).resolveReturnType(Mono.class, entity(String.class));
|
||||
testHandle(returnValue, returnType);
|
||||
@@ -387,6 +395,9 @@ public class ResponseEntityResultHandlerTests {
|
||||
Mono<ResponseEntity<?>> monoResponseEntityWildcard() { return null; }
|
||||
|
||||
Flux<?> fluxWildcard() { return null; }
|
||||
|
||||
Object object() { return null; }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user