org.springframework.web.servlet.mvc.method.annotation
Class RequestMappingHandlerAdapter

java.lang.Object
  extended by org.springframework.context.support.ApplicationObjectSupport
      extended by org.springframework.web.context.support.WebApplicationObjectSupport
          extended by org.springframework.web.servlet.support.WebContentGenerator
              extended by org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter
                  extended by org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
All Implemented Interfaces:
Aware, BeanFactoryAware, InitializingBean, ApplicationContextAware, Ordered, ServletContextAware, HandlerAdapter

public class RequestMappingHandlerAdapter
extends AbstractHandlerMethodAdapter
implements BeanFactoryAware, InitializingBean

An AbstractHandlerMethodAdapter that supports HandlerMethods with the signature -- method argument and return types, defined in @RequestMapping.

Support for custom argument and return value types can be added via setCustomArgumentResolvers(java.util.List) and setCustomReturnValueHandlers(java.util.List). Or alternatively to re-configure all argument and return value types use setArgumentResolvers(java.util.List) and setReturnValueHandlers(List).

Since:
3.1
Author:
Rossen Stoyanchev
See Also:
HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler

Field Summary
static ReflectionUtils.MethodFilter INIT_BINDER_METHODS
          MethodFilter that matches @InitBinder methods.
static ReflectionUtils.MethodFilter MODEL_ATTRIBUTE_METHODS
          MethodFilter that matches @ModelAttribute methods.
 
Fields inherited from class org.springframework.web.servlet.support.WebContentGenerator
METHOD_GET, METHOD_HEAD, METHOD_POST
 
Fields inherited from class org.springframework.context.support.ApplicationObjectSupport
logger
 
Fields inherited from interface org.springframework.core.Ordered
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
 
Constructor Summary
RequestMappingHandlerAdapter()
          Default constructor.
 
Method Summary
 void afterPropertiesSet()
          Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware).
protected  ServletRequestDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> binderMethods)
          Template method to create a new ServletRequestDataBinderFactory instance.
 HandlerMethodArgumentResolverComposite getArgumentResolvers()
          Return the configured argument resolvers, or possibly null if not initialized yet via afterPropertiesSet().
protected  ConfigurableBeanFactory getBeanFactory()
          Return the owning factory of this bean instance, or null.
 List<HandlerMethodArgumentResolver> getCustomArgumentResolvers()
          Return the custom argument resolvers, or null.
 List<HandlerMethodReturnValueHandler> getCustomReturnValueHandlers()
          Return the custom return value handlers, or null.
protected  List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers()
          Return the list of argument resolvers to use including built-in resolvers and custom resolvers provided via setCustomArgumentResolvers(java.util.List).
protected  List<HandlerMethodArgumentResolver> getDefaultInitBinderArgumentResolvers()
          Return the list of argument resolvers to use for @InitBinder methods including built-in and custom resolvers.
protected  List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers()
          Return the list of return value handlers to use including built-in and custom handlers provided via setReturnValueHandlers(java.util.List).
 HandlerMethodArgumentResolverComposite getInitBinderArgumentResolvers()
          Return the argument resolvers for @InitBinder methods, or possibly null if not initialized yet via afterPropertiesSet().
protected  long getLastModifiedInternal(HttpServletRequest request, HandlerMethod handlerMethod)
          This implementation always returns -1.
 List<HttpMessageConverter<?>> getMessageConverters()
          Return the configured message body converters.
 List<ModelAndViewResolver> getModelAndViewResolvers()
          Return the configured ModelAndViewResolvers, or null.
 HandlerMethodReturnValueHandlerComposite getReturnValueHandlers()
          Return the configured handlers, or possibly null if not initialized yet via afterPropertiesSet().
 WebBindingInitializer getWebBindingInitializer()
          Return the configured WebBindingInitializer, or null.
protected  ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod)
          Use the given handler method to handle the request.
 void setArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
          Configure the complete list of supported argument types thus overriding the resolvers that would otherwise be configured by default.
 void setBeanFactory(BeanFactory beanFactory)
          Callback that supplies the owning factory to a bean instance.
 void setCacheSecondsForSessionAttributeHandlers(int cacheSecondsForSessionAttributeHandlers)
          Cache content produced by @SessionAttributes annotated handlers for the given number of seconds.
 void setCustomArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
          Provide resolvers for custom argument types.
 void setCustomReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers)
          Provide handlers for custom return value types.
 void setIgnoreDefaultModelOnRedirect(boolean ignoreDefaultModelOnRedirect)
          A controller can use the "default" Model in rendering and redirect scenarios.
 void setInitBinderArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
          Configure the supported argument types in @InitBinder methods.
 void setMessageConverters(List<HttpMessageConverter<?>> messageConverters)
          Provide the converters to use in argument resolvers and return value handlers that support reading and/or writing to the body of the request and response.
 void setModelAndViewResolvers(List<ModelAndViewResolver> modelAndViewResolvers)
          Provide custom ModelAndViewResolvers.
 void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer)
          Set the ParameterNameDiscoverer to use for resolving method parameter names if needed (e.g.
 void setReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers)
          Configure the complete list of supported return value types thus overriding handlers that would otherwise be configured by default.
 void setSessionAttributeStore(SessionAttributeStore sessionAttributeStore)
          Specify the strategy to store session attributes with.
 void setSynchronizeOnSession(boolean synchronizeOnSession)
          Set if controller execution should be synchronized on the session, to serialize parallel invocations from the same client.
 void setWebBindingInitializer(WebBindingInitializer webBindingInitializer)
          Provide a WebBindingInitializer with "global" initialization to apply to every DataBinder instance.
protected  boolean supportsInternal(HandlerMethod handlerMethod)
          Return true if all arguments and the return value of the given HandlerMethod are supported by the configured resolvers and handlers.
 
Methods inherited from class org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter
getLastModified, getOrder, handle, setOrder, supports
 
Methods inherited from class org.springframework.web.servlet.support.WebContentGenerator
applyCacheSeconds, applyCacheSeconds, cacheForSeconds, cacheForSeconds, checkAndPrepare, checkAndPrepare, getCacheSeconds, getSupportedMethods, isRequireSession, isUseCacheControlHeader, isUseCacheControlNoStore, isUseExpiresHeader, preventCaching, setCacheSeconds, setRequireSession, setSupportedMethods, setUseCacheControlHeader, setUseCacheControlNoStore, setUseExpiresHeader
 
Methods inherited from class org.springframework.web.context.support.WebApplicationObjectSupport
getServletContext, getTempDir, getWebApplicationContext, initApplicationContext, initServletContext, isContextRequired, setServletContext
 
Methods inherited from class org.springframework.context.support.ApplicationObjectSupport
getApplicationContext, getMessageSourceAccessor, initApplicationContext, requiredContextClass, setApplicationContext
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

INIT_BINDER_METHODS

public static final ReflectionUtils.MethodFilter INIT_BINDER_METHODS
MethodFilter that matches @InitBinder methods.


MODEL_ATTRIBUTE_METHODS

public static final ReflectionUtils.MethodFilter MODEL_ATTRIBUTE_METHODS
MethodFilter that matches @ModelAttribute methods.

Constructor Detail

RequestMappingHandlerAdapter

public RequestMappingHandlerAdapter()
Default constructor.

Method Detail

setCustomArgumentResolvers

public void setCustomArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
Provide resolvers for custom argument types. Custom resolvers are ordered after built-in ones. To override the built-in support for argument resolution use setArgumentResolvers(java.util.List) instead.


getCustomArgumentResolvers

public List<HandlerMethodArgumentResolver> getCustomArgumentResolvers()
Return the custom argument resolvers, or null.


setArgumentResolvers

public void setArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
Configure the complete list of supported argument types thus overriding the resolvers that would otherwise be configured by default.


getArgumentResolvers

public HandlerMethodArgumentResolverComposite getArgumentResolvers()
Return the configured argument resolvers, or possibly null if not initialized yet via afterPropertiesSet().


setInitBinderArgumentResolvers

public void setInitBinderArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
Configure the supported argument types in @InitBinder methods.


getInitBinderArgumentResolvers

public HandlerMethodArgumentResolverComposite getInitBinderArgumentResolvers()
Return the argument resolvers for @InitBinder methods, or possibly null if not initialized yet via afterPropertiesSet().


setCustomReturnValueHandlers

public void setCustomReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers)
Provide handlers for custom return value types. Custom handlers are ordered after built-in ones. To override the built-in support for return value handling use setReturnValueHandlers(java.util.List).


getCustomReturnValueHandlers

public List<HandlerMethodReturnValueHandler> getCustomReturnValueHandlers()
Return the custom return value handlers, or null.


setReturnValueHandlers

public void setReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers)
Configure the complete list of supported return value types thus overriding handlers that would otherwise be configured by default.


getReturnValueHandlers

public HandlerMethodReturnValueHandlerComposite getReturnValueHandlers()
Return the configured handlers, or possibly null if not initialized yet via afterPropertiesSet().


setModelAndViewResolvers

public void setModelAndViewResolvers(List<ModelAndViewResolver> modelAndViewResolvers)
Provide custom ModelAndViewResolvers.

Note: This method is available for backwards compatibility only. However, it is recommended to re-write a ModelAndViewResolver as HandlerMethodReturnValueHandler. An adapter between the two interfaces is not possible since the HandlerMethodReturnValueHandler.supportsReturnType(org.springframework.core.MethodParameter) method cannot be implemented. Hence ModelAndViewResolvers are limited to always being invoked at the end after all other return value handlers have been given a chance.

A HandlerMethodReturnValueHandler provides better access to the return type and controller method information and can be ordered freely relative to other return value handlers.


getModelAndViewResolvers

public List<ModelAndViewResolver> getModelAndViewResolvers()
Return the configured ModelAndViewResolvers, or null.


setMessageConverters

public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters)
Provide the converters to use in argument resolvers and return value handlers that support reading and/or writing to the body of the request and response.


getMessageConverters

public List<HttpMessageConverter<?>> getMessageConverters()
Return the configured message body converters.


setWebBindingInitializer

public void setWebBindingInitializer(WebBindingInitializer webBindingInitializer)
Provide a WebBindingInitializer with "global" initialization to apply to every DataBinder instance.


getWebBindingInitializer

public WebBindingInitializer getWebBindingInitializer()
Return the configured WebBindingInitializer, or null.


setSessionAttributeStore

public void setSessionAttributeStore(SessionAttributeStore sessionAttributeStore)
Specify the strategy to store session attributes with. The default is DefaultSessionAttributeStore, storing session attributes in the HttpSession with the same attribute name as in the model.


setCacheSecondsForSessionAttributeHandlers

public void setCacheSecondsForSessionAttributeHandlers(int cacheSecondsForSessionAttributeHandlers)
Cache content produced by @SessionAttributes annotated handlers for the given number of seconds. Default is 0, preventing caching completely.

In contrast to the "cacheSeconds" property which will apply to all general handlers (but not to @SessionAttributes annotated handlers), this setting will apply to @SessionAttributes handlers only.

See Also:
WebContentGenerator.setCacheSeconds(int), SessionAttributes

setSynchronizeOnSession

public void setSynchronizeOnSession(boolean synchronizeOnSession)
Set if controller execution should be synchronized on the session, to serialize parallel invocations from the same client.

More specifically, the execution of the handleRequestInternal method will get synchronized if this flag is "true". The best available session mutex will be used for the synchronization; ideally, this will be a mutex exposed by HttpSessionMutexListener.

The session mutex is guaranteed to be the same object during the entire lifetime of the session, available under the key defined by the SESSION_MUTEX_ATTRIBUTE constant. It serves as a safe reference to synchronize on for locking on the current session.

In many cases, the HttpSession reference itself is a safe mutex as well, since it will always be the same object reference for the same active logical session. However, this is not guaranteed across different servlet containers; the only 100% safe way is a session mutex.

See Also:
HttpSessionMutexListener, WebUtils.getSessionMutex(javax.servlet.http.HttpSession)

setParameterNameDiscoverer

public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer)
Set the ParameterNameDiscoverer to use for resolving method parameter names if needed (e.g. for default attribute names). Default is a LocalVariableTableParameterNameDiscoverer.


setIgnoreDefaultModelOnRedirect

public void setIgnoreDefaultModelOnRedirect(boolean ignoreDefaultModelOnRedirect)
A controller can use the "default" Model in rendering and redirect scenarios. Alternatively, it can use RedirectAttributes to provide attributes for a redirect scenario.

When this flag is set to true, the "default" model is never used in a redirect even if the controller method doesn't explicitly declare a RedirectAttributes argument.

When set to false, the "default" model may be used in a redirect if the controller method doesn't explicitly declare a RedirectAttributes argument.

The default setting is false.

See Also:
RedirectAttributes

setBeanFactory

public void setBeanFactory(BeanFactory beanFactory)
Callback that supplies the owning factory to a bean instance.

Invoked after the population of normal bean properties but before an initialization callback such as InitializingBean.afterPropertiesSet() or a custom init-method.

A ConfigurableBeanFactory is expected for resolving expressions in method argument default values.

Specified by:
setBeanFactory in interface BeanFactoryAware
Parameters:
beanFactory - owning BeanFactory (never null). The bean can immediately call methods on the factory.
See Also:
BeanInitializationException

getBeanFactory

protected ConfigurableBeanFactory getBeanFactory()
Return the owning factory of this bean instance, or null.


afterPropertiesSet

public void afterPropertiesSet()
Description copied from interface: InitializingBean
Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware).

This method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw an exception in the event of misconfiguration.

Specified by:
afterPropertiesSet in interface InitializingBean

getDefaultArgumentResolvers

protected List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers()
Return the list of argument resolvers to use including built-in resolvers and custom resolvers provided via setCustomArgumentResolvers(java.util.List).


getDefaultInitBinderArgumentResolvers

protected List<HandlerMethodArgumentResolver> getDefaultInitBinderArgumentResolvers()
Return the list of argument resolvers to use for @InitBinder methods including built-in and custom resolvers.


getDefaultReturnValueHandlers

protected List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers()
Return the list of return value handlers to use including built-in and custom handlers provided via setReturnValueHandlers(java.util.List).


supportsInternal

protected boolean supportsInternal(HandlerMethod handlerMethod)
Return true if all arguments and the return value of the given HandlerMethod are supported by the configured resolvers and handlers.

Specified by:
supportsInternal in class AbstractHandlerMethodAdapter
Parameters:
handlerMethod - the handler method to check
Returns:
whether or not this adapter can adapt the given method

getLastModifiedInternal

protected long getLastModifiedInternal(HttpServletRequest request,
                                       HandlerMethod handlerMethod)
This implementation always returns -1. An @RequestMapping method can calculate the lastModified value, call WebRequest.checkNotModified(long), and return null if the result of that call is true.

Specified by:
getLastModifiedInternal in class AbstractHandlerMethodAdapter
Parameters:
request - current HTTP request
handlerMethod - handler method to use
Returns:
the lastModified value for the given handler

handleInternal

protected final ModelAndView handleInternal(HttpServletRequest request,
                                            HttpServletResponse response,
                                            HandlerMethod handlerMethod)
                                     throws Exception
Description copied from class: AbstractHandlerMethodAdapter
Use the given handler method to handle the request.

Specified by:
handleInternal in class AbstractHandlerMethodAdapter
Parameters:
request - current HTTP request
response - current HTTP response
handlerMethod - handler method to use. This object must have previously been passed to the AbstractHandlerMethodAdapter.supportsInternal(HandlerMethod) this interface, which must have returned true.
Returns:
ModelAndView object with the name of the view and the required model data, or null if the request has been handled directly
Throws:
Exception - in case of errors

createDataBinderFactory

protected ServletRequestDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> binderMethods)
                                                           throws Exception
Template method to create a new ServletRequestDataBinderFactory instance.

The default implementation creates a ServletRequestDataBinderFactory. This can be overridden for custom ServletRequestDataBinder subclasses.

Parameters:
binderMethods - @InitBinder methods
Returns:
the ServletRequestDataBinderFactory instance to use
Throws:
Exception - in case of invalid state or arguments