From 63dc53a5ea1ab1e38c19f6f10316401c8bcfc333 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 29 Mar 2010 12:25:49 +0000 Subject: [PATCH] SPR-6861 - enable overwriting of createHttpInputMessage and createHttpOutputMessage in AnnotationMethodHandlerAdapter --- .../AnnotationMethodHandlerAdapter.java | 46 ++++++++++++++++--- .../support/HandlerMethodInvoker.java | 11 ++++- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index fac5088ca2b..88f34b6a904 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -457,6 +457,32 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator return new ServletRequestDataBinder(target, objectName); } + /** + * Template method for creating a new HttpInputMessage instance. + *

The default implementation creates a standard {@link ServletServerHttpRequest}. + * This can be overridden for custom {@code HttpInputMessage} implementations + * @param servletRequest current HTTP request + * @return the HttpInputMessage instance to use + * @throws Exception in case of errors + */ + protected HttpInputMessage createHttpInputMessage(HttpServletRequest servletRequest) throws Exception { + + return new ServletServerHttpRequest(servletRequest); + } + + /** + * Template method for creating a new HttpOuputMessage instance. + *

The default implementation creates a standard {@link ServletServerHttpResponse}. + * This can be overridden for custom {@code HttpOutputMessage} implementations + * @param servletResponse current HTTP response + * @return the HttpInputMessage instance to use + * @throws Exception in case of errors + */ + protected HttpOutputMessage createHttpOutputMessage(HttpServletResponse servletResponse) throws Exception { + + return new ServletServerHttpResponse(servletResponse); + } + /** * Servlet-specific subclass of {@link HandlerMethodResolver}. @@ -687,7 +713,13 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator @Override protected HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception { HttpServletRequest servletRequest = (HttpServletRequest) webRequest.getNativeRequest(); - return new ServletServerHttpRequest(servletRequest); + return AnnotationMethodHandlerAdapter.this.createHttpInputMessage(servletRequest); + } + + @Override + protected HttpOutputMessage createHttpOutputMessage(NativeWebRequest webRequest) throws Exception { + HttpServletResponse servletResponse = (HttpServletResponse) webRequest.getNativeResponse(); + return AnnotationMethodHandlerAdapter.this.createHttpOutputMessage(servletResponse); } @Override @@ -848,24 +880,24 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator } private void handleResponseBody(Object returnValue, ServletWebRequest webRequest) - throws ServletException, IOException { + throws Exception { if (returnValue == null) { return; } - HttpInputMessage inputMessage = new ServletServerHttpRequest(webRequest.getRequest()); - HttpOutputMessage outputMessage = new ServletServerHttpResponse(webRequest.getResponse()); + HttpInputMessage inputMessage = createHttpInputMessage(webRequest); + HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest); writeWithMessageConverters(returnValue, inputMessage, outputMessage); } private void handleHttpEntityResponse(HttpEntity responseEntity, ServletWebRequest webRequest) - throws ServletException, IOException { + throws Exception { if (responseEntity == null) { return; } - HttpInputMessage inputMessage = new ServletServerHttpRequest(webRequest.getRequest()); - HttpOutputMessage outputMessage = new ServletServerHttpResponse(webRequest.getResponse()); + HttpInputMessage inputMessage = createHttpInputMessage(webRequest); + HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest); HttpHeaders entityHeaders = responseEntity.getHeaders(); if (!entityHeaders.isEmpty()) { diff --git a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java index a3bedef15fc..fc083fce18c 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java +++ b/org.springframework.web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodInvoker.java @@ -48,6 +48,7 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.MediaType; +import org.springframework.http.HttpOutputMessage; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.ui.ExtendedModelMap; import org.springframework.ui.Model; @@ -802,12 +803,20 @@ public class HandlerMethodInvoker { /** * Return a {@link HttpInputMessage} for the given {@link NativeWebRequest}. - *

Throws an UnsupportedOperationException by default. + *

Throws an UnsupportedOperation1Exception by default. */ protected HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception { throw new UnsupportedOperationException("@RequestBody not supported"); } + /** + * Return a {@link HttpOutputMessage} for the given {@link NativeWebRequest}. + *

Throws an UnsupportedOperationException by default. + */ + protected HttpOutputMessage createHttpOutputMessage(NativeWebRequest webRequest) throws Exception { + throw new UnsupportedOperationException("@ResponseBody not supported"); + } + protected String parseDefaultValueAttribute(String value) { return (ValueConstants.DEFAULT_NONE.equals(value) ? null : value); }