SPR-6861 - enable overwriting of createHttpInputMessage and createHttpOutputMessage in AnnotationMethodHandlerAdapter

This commit is contained in:
Arjen Poutsma 2010-03-29 12:25:49 +00:00
parent bc7679f9fc
commit 63dc53a5ea
2 changed files with 49 additions and 8 deletions

View File

@ -457,6 +457,32 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
return new ServletRequestDataBinder(target, objectName); return new ServletRequestDataBinder(target, objectName);
} }
/**
* Template method for creating a new HttpInputMessage instance.
* <p>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.
* <p>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}. * Servlet-specific subclass of {@link HandlerMethodResolver}.
@ -687,7 +713,13 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
@Override @Override
protected HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception { protected HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception {
HttpServletRequest servletRequest = (HttpServletRequest) webRequest.getNativeRequest(); 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 @Override
@ -848,24 +880,24 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
} }
private void handleResponseBody(Object returnValue, ServletWebRequest webRequest) private void handleResponseBody(Object returnValue, ServletWebRequest webRequest)
throws ServletException, IOException { throws Exception {
if (returnValue == null) { if (returnValue == null) {
return; return;
} }
HttpInputMessage inputMessage = new ServletServerHttpRequest(webRequest.getRequest()); HttpInputMessage inputMessage = createHttpInputMessage(webRequest);
HttpOutputMessage outputMessage = new ServletServerHttpResponse(webRequest.getResponse()); HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest);
writeWithMessageConverters(returnValue, inputMessage, outputMessage); writeWithMessageConverters(returnValue, inputMessage, outputMessage);
} }
private void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest) private void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest)
throws ServletException, IOException { throws Exception {
if (responseEntity == null) { if (responseEntity == null) {
return; return;
} }
HttpInputMessage inputMessage = new ServletServerHttpRequest(webRequest.getRequest()); HttpInputMessage inputMessage = createHttpInputMessage(webRequest);
HttpOutputMessage outputMessage = new ServletServerHttpResponse(webRequest.getResponse()); HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest);
HttpHeaders entityHeaders = responseEntity.getHeaders(); HttpHeaders entityHeaders = responseEntity.getHeaders();
if (!entityHeaders.isEmpty()) { if (!entityHeaders.isEmpty()) {

View File

@ -48,6 +48,7 @@ import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.ui.ExtendedModelMap; import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model; import org.springframework.ui.Model;
@ -802,12 +803,20 @@ public class HandlerMethodInvoker {
/** /**
* Return a {@link HttpInputMessage} for the given {@link NativeWebRequest}. * Return a {@link HttpInputMessage} for the given {@link NativeWebRequest}.
* <p>Throws an UnsupportedOperationException by default. * <p>Throws an UnsupportedOperation1Exception by default.
*/ */
protected HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception { protected HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception {
throw new UnsupportedOperationException("@RequestBody not supported"); throw new UnsupportedOperationException("@RequestBody not supported");
} }
/**
* Return a {@link HttpOutputMessage} for the given {@link NativeWebRequest}.
* <p>Throws an UnsupportedOperationException by default.
*/
protected HttpOutputMessage createHttpOutputMessage(NativeWebRequest webRequest) throws Exception {
throw new UnsupportedOperationException("@ResponseBody not supported");
}
protected String parseDefaultValueAttribute(String value) { protected String parseDefaultValueAttribute(String value) {
return (ValueConstants.DEFAULT_NONE.equals(value) ? null : value); return (ValueConstants.DEFAULT_NONE.equals(value) ? null : value);
} }