Fix type check for ResponseEntity<ResponseBodyEmitter>

Issue: SPR-12693
master
Rossen Stoyanchev 10 years ago
parent 13cdd22f5e
commit 8f0ddf1b1d
  1. 11
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandler.java
  2. 6
      spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandlerTests.java

@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -66,14 +67,8 @@ public class ResponseBodyEmitterReturnValueHandler implements HandlerMethodRetur
return true; return true;
} }
else if (ResponseEntity.class.isAssignableFrom(returnType.getParameterType())) { else if (ResponseEntity.class.isAssignableFrom(returnType.getParameterType())) {
Type paramType = returnType.getGenericParameterType(); Class<?> bodyType = ResolvableType.forMethodParameter(returnType).getGeneric(0).resolve();
if (paramType instanceof ParameterizedType) { return (bodyType != null && ResponseBodyEmitter.class.isAssignableFrom(bodyType));
ParameterizedType type = (ParameterizedType) paramType;
Type[] typeArguments = type.getActualTypeArguments();
if (typeArguments.length == 1) {
return ResponseBodyEmitter.class.isAssignableFrom((Class<?>) typeArguments[0]);
}
}
} }
return false; return false;
} }

@ -18,6 +18,7 @@ package org.springframework.web.servlet.mvc.method.annotation;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; 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, "handleSse")));
assertTrue(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntity"))); assertTrue(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntity")));
assertFalse(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntityString"))); assertFalse(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntityString")));
assertFalse(this.handler.supportsReturnType(returnType(TestController.class, "handleResponseEntityParameterized")));
} }
@Test @Test
@ -207,6 +209,10 @@ public class ResponseBodyEmitterReturnValueHandlerTests {
return null; return null;
} }
private ResponseEntity<AtomicReference<String>> handleResponseEntityParameterized() {
return null;
}
} }
private static class SimpleBean { private static class SimpleBean {

Loading…
Cancel
Save