Overridable invokeHandlerMethod and createInvocableHandlerMethod hooks

Issue: SPR-13293
master
Juergen Hoeller 9 years ago
parent b1d6ae77e1
commit 10a2f50130
  1. 44
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java

@ -109,6 +109,7 @@ import org.springframework.web.util.WebUtils;
* {@link #setArgumentResolvers} and {@link #setReturnValueHandlers(List)}. * {@link #setArgumentResolvers} and {@link #setReturnValueHandlers(List)}.
* *
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @author Juergen Hoeller
* @since 3.1 * @since 3.1
* @see HandlerMethodArgumentResolver * @see HandlerMethodArgumentResolver
* @see HandlerMethodReturnValueHandler * @see HandlerMethodReturnValueHandler
@ -720,12 +721,12 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
if (session != null) { if (session != null) {
Object mutex = WebUtils.getSessionMutex(session); Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) { synchronized (mutex) {
return invokeHandleMethod(request, response, handlerMethod); return invokeHandlerMethod(request, response, handlerMethod);
} }
} }
} }
return invokeHandleMethod(request, response, handlerMethod); return invokeHandlerMethod(request, response, handlerMethod);
} }
/** /**
@ -761,25 +762,32 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
/** /**
* Invoke the {@link RequestMapping} handler method preparing a {@link ModelAndView} * Invoke the {@link RequestMapping} handler method preparing a {@link ModelAndView}
* if view resolution is required. * if view resolution is required.
* @since 4.2
* @see #createInvocableHandlerMethod(HandlerMethod)
*/ */
private ModelAndView invokeHandleMethod(HttpServletRequest request, protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
ServletWebRequest webRequest = new ServletWebRequest(request, response); ServletWebRequest webRequest = new ServletWebRequest(request, response);
WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod); WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory); ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
ServletInvocableHandlerMethod requestMappingMethod = createRequestMappingMethod(handlerMethod, binderFactory);
ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
invocableMethod.setDataBinderFactory(binderFactory);
invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
ModelAndViewContainer mavContainer = new ModelAndViewContainer(); ModelAndViewContainer mavContainer = new ModelAndViewContainer();
mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request)); mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
modelFactory.initModel(webRequest, mavContainer, requestMappingMethod); modelFactory.initModel(webRequest, mavContainer, invocableMethod);
mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect); mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response); AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
asyncWebRequest.setTimeout(this.asyncRequestTimeout); asyncWebRequest.setTimeout(this.asyncRequestTimeout);
final WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
asyncManager.setTaskExecutor(this.taskExecutor); asyncManager.setTaskExecutor(this.taskExecutor);
asyncManager.setAsyncWebRequest(asyncWebRequest); asyncManager.setAsyncWebRequest(asyncWebRequest);
asyncManager.registerCallableInterceptors(this.callableInterceptors); asyncManager.registerCallableInterceptors(this.callableInterceptors);
@ -789,15 +797,13 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
Object result = asyncManager.getConcurrentResult(); Object result = asyncManager.getConcurrentResult();
mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0]; mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
asyncManager.clearConcurrentResult(); asyncManager.clearConcurrentResult();
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Found concurrent result value [" + result + "]"); logger.debug("Found concurrent result value [" + result + "]");
} }
requestMappingMethod = requestMappingMethod.wrapConcurrentResult(result); invocableMethod = invocableMethod.wrapConcurrentResult(result);
} }
requestMappingMethod.invokeAndHandle(webRequest, mavContainer); invocableMethod.invokeAndHandle(webRequest, mavContainer);
if (asyncManager.isConcurrentHandlingStarted()) { if (asyncManager.isConcurrentHandlingStarted()) {
return null; return null;
} }
@ -805,16 +811,14 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
return getModelAndView(mavContainer, modelFactory, webRequest); return getModelAndView(mavContainer, modelFactory, webRequest);
} }
private ServletInvocableHandlerMethod createRequestMappingMethod( /**
HandlerMethod handlerMethod, WebDataBinderFactory binderFactory) { * Create a {@link ServletInvocableHandlerMethod} from the given {@link HandlerMethod} definition.
* @param handlerMethod the {@link HandlerMethod} definition
ServletInvocableHandlerMethod requestMethod; * @return the corresponding {@link ServletInvocableHandlerMethod} (or custom subclass thereof)
requestMethod = new ServletInvocableHandlerMethod(handlerMethod); * @since 4.2
requestMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers); */
requestMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers); protected ServletInvocableHandlerMethod createInvocableHandlerMethod(HandlerMethod handlerMethod) {
requestMethod.setDataBinderFactory(binderFactory); return new ServletInvocableHandlerMethod(handlerMethod);
requestMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
return requestMethod;
} }
private ModelFactory getModelFactory(HandlerMethod handlerMethod, WebDataBinderFactory binderFactory) { private ModelFactory getModelFactory(HandlerMethod handlerMethod, WebDataBinderFactory binderFactory) {

Loading…
Cancel
Save