Skip to content

Commit 5690358

Browse files
committed
ResponseEntity declared as Object in WebFlux controller
Issue: SPR-15785
1 parent 57221ab commit 5690358

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,18 @@ public Object getReturnValue() {
9292
}
9393

9494
/**
95-
* Return the type of the value returned from the handler.
95+
* Return the type of the value returned from the handler -- e.g. the return
96+
* type declared on a controller method's signature. Also see
97+
* {@link #getReturnTypeSource()} to obtain the underlying
98+
* {@link MethodParameter} for the return type.
9699
*/
97100
public ResolvableType getReturnType() {
98101
return this.returnType;
99102
}
100103

101104
/**
102-
* Return the {@link MethodParameter} from which
103-
* {@link #getReturnType() returnType} was created.
105+
* Return the {@link MethodParameter} from which {@link #getReturnType()
106+
* returnType} was created.
104107
*/
105108
public MethodParameter getReturnTypeSource() {
106109
return (MethodParameter) this.returnType.getSource();

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,25 @@ public ResponseEntityResultHandler(List<HttpMessageWriter<?>> writers,
8080

8181
@Override
8282
public boolean supports(HandlerResult result) {
83-
if (isSupportedType(result.getReturnType().getRawClass())) {
83+
Class<?> valueType = resolveReturnValueType(result);
84+
if (isSupportedType(valueType)) {
8485
return true;
8586
}
8687
ReactiveAdapter adapter = getAdapter(result);
8788
return adapter != null && !adapter.isNoValue() &&
8889
isSupportedType(result.getReturnType().getGeneric().resolve(Object.class));
8990
}
9091

92+
@Nullable
93+
private static Class<?> resolveReturnValueType(HandlerResult result) {
94+
Class<?> valueType = result.getReturnType().getRawClass();
95+
Object value = result.getReturnValue();
96+
if ((valueType == null || valueType.equals(Object.class)) && value != null) {
97+
valueType = value.getClass();
98+
}
99+
return valueType;
100+
}
101+
91102
private boolean isSupportedType(@Nullable Class<?> clazz) {
92103
return (clazz != null && HttpEntity.class.isAssignableFrom(clazz) &&
93104
!RequestEntity.class.isAssignableFrom(clazz));

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ public void supports() throws NoSuchMethodException {
120120

121121
returnType = on(TestController.class).resolveReturnType(CompletableFuture.class, entity(String.class));
122122
assertTrue(this.resultHandler.supports(handlerResult(value, returnType)));
123+
124+
// SPR-15785
125+
value = ResponseEntity.ok("testing");
126+
returnType = on(TestController.class).resolveReturnType(Object.class);
127+
assertTrue(this.resultHandler.supports(handlerResult(value, returnType)));
123128
}
124129

125130
@Test
@@ -190,6 +195,9 @@ public void handleReturnTypes() throws Exception {
190195
MethodParameter returnType = on(TestController.class).resolveReturnType(entity(String.class));
191196
testHandle(returnValue, returnType);
192197

198+
returnType = on(TestController.class).resolveReturnType(Object.class);
199+
testHandle(returnValue, returnType);
200+
193201
returnValue = Mono.just(ok("abc"));
194202
returnType = on(TestController.class).resolveReturnType(Mono.class, entity(String.class));
195203
testHandle(returnValue, returnType);
@@ -387,6 +395,9 @@ private static class TestController {
387395
Mono<ResponseEntity<?>> monoResponseEntityWildcard() { return null; }
388396

389397
Flux<?> fluxWildcard() { return null; }
398+
399+
Object object() { return null; }
400+
390401
}
391402

392403
}

0 commit comments

Comments
 (0)