diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandler.java index 9072a4574f..5ed597d0e2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandler.java @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.MethodParameter; +import org.springframework.core.ResolvableType; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -66,14 +67,8 @@ public class ResponseBodyEmitterReturnValueHandler implements HandlerMethodRetur return true; } else if (ResponseEntity.class.isAssignableFrom(returnType.getParameterType())) { - Type paramType = returnType.getGenericParameterType(); - if (paramType instanceof ParameterizedType) { - ParameterizedType type = (ParameterizedType) paramType; - Type[] typeArguments = type.getActualTypeArguments(); - if (typeArguments.length == 1) { - return ResponseBodyEmitter.class.isAssignableFrom((Class) typeArguments[0]); - } - } + Class bodyType = ResolvableType.forMethodParameter(returnType).getGeneric(0).resolve(); + return (bodyType != null && ResponseBodyEmitter.class.isAssignableFrom(bodyType)); } return false; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandlerTests.java index ed0034f715..4f4a2c989b 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandlerTests.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet.mvc.method.annotation; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import org.junit.Before; import org.junit.Test; @@ -86,6 +87,7 @@ public class ResponseBodyEmitterReturnValueHandlerTests { assertTrue(this.handler.supportsReturnType(returnType(TestController.class, "handleSse"))); assertTrue(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntity"))); assertFalse(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntityString"))); + assertFalse(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntityParameterized"))); } @Test @@ -207,6 +209,10 @@ public class ResponseBodyEmitterReturnValueHandlerTests { return null; } + private ResponseEntity> handleResponseEntityParameterized() { + return null; + } + } private static class SimpleBean {