org.springframework.web.servlet.mvc.annotation
Class AnnotationMethodHandlerAdapter

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.annotation.AnnotationMethodHandlerAdapter
All Implemented Interfaces:
ApplicationContextAware, ServletContextAware, HandlerAdapter

public class AnnotationMethodHandlerAdapter
extends WebContentGenerator
implements HandlerAdapter

Implementation of the HandlerAdapter interface that maps handler methods based on HTTP paths, HTTP methods and request parameters expressed through the RequestMapping annotation.

Supports request parameter binding through the RequestParam annotation. Also supports the ModelAttribute annotation for exposing model attribute values to the view, as well as InitBinder for binder initialization methods and SessionAttributes for automatic session management of specific attributes.

This adapter can be customized through various bean properties. A common use case is to apply shared binder initialization logic through a custom WebBindingInitializer.

Since:
2.5
Author:
Juergen Hoeller, Arjen Poutsma
See Also:
setPathMatcher(org.springframework.util.PathMatcher), setMethodNameResolver(org.springframework.web.servlet.mvc.multiaction.MethodNameResolver), setWebBindingInitializer(org.springframework.web.bind.support.WebBindingInitializer), setSessionAttributeStore(org.springframework.web.bind.support.SessionAttributeStore)

Field Summary
static java.lang.String PAGE_NOT_FOUND_LOG_CATEGORY
          Log category to use when no mapped handler is found for a request.
protected static org.apache.commons.logging.Log pageNotFoundLogger
          Additional logger to use when no mapped handler is found for a request.
 
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
 
Constructor Summary
AnnotationMethodHandlerAdapter()
           
 
Method Summary
protected  ServletRequestDataBinder createBinder(javax.servlet.http.HttpServletRequest request, java.lang.Object target, java.lang.String objectName)
          Template method for creating a new ServletRequestDataBinder instance.
 long getLastModified(javax.servlet.http.HttpServletRequest request, java.lang.Object handler)
          Same contract as for HttpServlet's getLastModified method.
 ModelAndView handle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler)
          Use the given handler to handle this request.
protected  ModelAndView handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException ex, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          Handle the case where no request handler method was found for the particular HTTP request method.
protected  ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
          Handle the case where no request handler method was found.
protected  ModelAndView invokeHandlerMethod(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler)
           
 void setAlwaysUseFullPath(boolean alwaysUseFullPath)
          Set if URL lookup should always use the full path within the current servlet context.
 void setCacheSecondsForSessionAttributeHandlers(int cacheSecondsForSessionAttributeHandlers)
          Cache content produced by @SessionAttributes annotated handlers for the given number of seconds.
 void setCustomArgumentResolver(WebArgumentResolver argumentResolver)
          Set a custom ArgumentResolvers to use for special method parameter types.
 void setCustomArgumentResolvers(WebArgumentResolver[] argumentResolvers)
          Set one or more custom ArgumentResolvers to use for special method parameter types.
 void setMethodNameResolver(MethodNameResolver methodNameResolver)
          Set the MethodNameResolver to use for resolving default handler methods (carrying an empty @RequestMapping annotation).
 void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer)
          Set the ParameterNameDiscoverer to use for resolving method parameter names if needed (e.g.
 void setPathMatcher(PathMatcher pathMatcher)
          Set the PathMatcher implementation to use for matching URL paths against registered URL patterns.
 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 setUrlDecode(boolean urlDecode)
          Set if context path and request URI should be URL-decoded.
 void setUrlPathHelper(UrlPathHelper urlPathHelper)
          Set the UrlPathHelper to use for resolution of lookup paths.
 void setWebBindingInitializer(WebBindingInitializer webBindingInitializer)
          Specify a WebBindingInitializer which will apply pre-configured configuration to every DataBinder that this controller uses.
 boolean supports(java.lang.Object handler)
          Given a handler instance, return whether or not this HandlerAdapter can support it.
 
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

PAGE_NOT_FOUND_LOG_CATEGORY

public static final java.lang.String PAGE_NOT_FOUND_LOG_CATEGORY
Log category to use when no mapped handler is found for a request.

See Also:
pageNotFoundLogger, Constant Field Values

pageNotFoundLogger

protected static final org.apache.commons.logging.Log pageNotFoundLogger
Additional logger to use when no mapped handler is found for a request.

See Also:
PAGE_NOT_FOUND_LOG_CATEGORY
Constructor Detail

AnnotationMethodHandlerAdapter

public AnnotationMethodHandlerAdapter()
Method Detail

setAlwaysUseFullPath

public void setAlwaysUseFullPath(boolean alwaysUseFullPath)
Set if URL lookup should always use the full path within the current servlet context. Else, the path within the current servlet mapping is used if applicable (that is, in the case of a ".../*" servlet mapping in web.xml).

Default is "false".

See Also:
UrlPathHelper.setAlwaysUseFullPath(boolean)

setUrlDecode

public void setUrlDecode(boolean urlDecode)
Set if context path and request URI should be URL-decoded. Both are returned undecoded by the Servlet API, in contrast to the servlet path.

Uses either the request encoding or the default encoding according to the Servlet spec (ISO-8859-1).

See Also:
UrlPathHelper.setUrlDecode(boolean)

setUrlPathHelper

public void setUrlPathHelper(UrlPathHelper urlPathHelper)
Set the UrlPathHelper to use for resolution of lookup paths.

Use this to override the default UrlPathHelper with a custom subclass, or to share common UrlPathHelper settings across multiple HandlerMappings and HandlerAdapters.


setPathMatcher

public void setPathMatcher(PathMatcher pathMatcher)
Set the PathMatcher implementation to use for matching URL paths against registered URL patterns. Default is AntPathMatcher.

See Also:
AntPathMatcher

setMethodNameResolver

public void setMethodNameResolver(MethodNameResolver methodNameResolver)
Set the MethodNameResolver to use for resolving default handler methods (carrying an empty @RequestMapping annotation).

Will only kick in when the handler method cannot be resolved uniquely through the annotation metadata already.


setWebBindingInitializer

public void setWebBindingInitializer(WebBindingInitializer webBindingInitializer)
Specify a WebBindingInitializer which will apply pre-configured configuration to every DataBinder that this controller uses.


setSessionAttributeStore

public void setSessionAttributeStore(SessionAttributeStore sessionAttributeStore)
Specify the strategy to store session attributes with.

Default is DefaultSessionAttributeStore, storing session attributes in the HttpSession, using 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 annotated 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 each handler 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.


setCustomArgumentResolver

public void setCustomArgumentResolver(WebArgumentResolver argumentResolver)
Set a custom ArgumentResolvers to use for special method parameter types. Such a custom ArgumentResolver will kick in first, having a chance to resolve an argument value before the standard argument handling kicks in.


setCustomArgumentResolvers

public void setCustomArgumentResolvers(WebArgumentResolver[] argumentResolvers)
Set one or more custom ArgumentResolvers to use for special method parameter types. Any such custom ArgumentResolver will kick in first, having a chance to resolve an argument value before the standard argument handling kicks in.


supports

public boolean supports(java.lang.Object handler)
Description copied from interface: HandlerAdapter
Given a handler instance, return whether or not this HandlerAdapter can support it. Typical HandlerAdapters will base the decision on the handler type. HandlerAdapters will usually only support one handler type each.

A typical implementation:

return (handler instanceof MyHandler);

Specified by:
supports in interface HandlerAdapter
Parameters:
handler - handler object to check
Returns:
whether or not this object can use the given handler

handle

public ModelAndView handle(javax.servlet.http.HttpServletRequest request,
                           javax.servlet.http.HttpServletResponse response,
                           java.lang.Object handler)
                    throws java.lang.Exception
Description copied from interface: HandlerAdapter
Use the given handler to handle this request. The workflow that is required may vary widely.

Specified by:
handle in interface HandlerAdapter
Parameters:
request - current HTTP request
response - current HTTP response
handler - handler to use. This object must have previously been passed to the supports method of 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:
java.lang.Exception - in case of errors

invokeHandlerMethod

protected ModelAndView invokeHandlerMethod(javax.servlet.http.HttpServletRequest request,
                                           javax.servlet.http.HttpServletResponse response,
                                           java.lang.Object handler)
                                    throws java.lang.Exception
Throws:
java.lang.Exception

getLastModified

public long getLastModified(javax.servlet.http.HttpServletRequest request,
                            java.lang.Object handler)
Description copied from interface: HandlerAdapter
Same contract as for HttpServlet's getLastModified method. Can simply return -1 if there's no support in the handler class.

Specified by:
getLastModified in interface HandlerAdapter
Parameters:
request - current HTTP request
handler - handler to use
Returns:
the lastModified value for the given handler
See Also:
HttpServlet.getLastModified(javax.servlet.http.HttpServletRequest), LastModified.getLastModified(javax.servlet.http.HttpServletRequest)

handleNoSuchRequestHandlingMethod

protected ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex,
                                                         javax.servlet.http.HttpServletRequest request,
                                                         javax.servlet.http.HttpServletResponse response)
                                                  throws java.lang.Exception
Handle the case where no request handler method was found.

The default implementation logs a warning and sends an HTTP 404 error. Alternatively, a fallback view could be chosen, or the NoSuchRequestHandlingMethodException could be rethrown as-is.

Parameters:
ex - the NoSuchRequestHandlingMethodException to be handled
request - current HTTP request
response - current HTTP response
Returns:
a ModelAndView to render, or null if handled directly
Throws:
java.lang.Exception - an Exception that should be thrown as result of the servlet request

handleHttpRequestMethodNotSupportedException

protected ModelAndView handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException ex,
                                                                    javax.servlet.http.HttpServletRequest request,
                                                                    javax.servlet.http.HttpServletResponse response)
                                                             throws java.lang.Exception
Handle the case where no request handler method was found for the particular HTTP request method.

The default implementation logs a warning, sends an HTTP 405 error and sets the "Allow" header. Alternatively, a fallback view could be chosen, or the HttpRequestMethodNotSupportedException could be rethrown as-is.

Parameters:
ex - the HttpRequestMethodNotSupportedException to be handled
request - current HTTP request
response - current HTTP response
Returns:
a ModelAndView to render, or null if handled directly
Throws:
java.lang.Exception - an Exception that should be thrown as result of the servlet request

createBinder

protected ServletRequestDataBinder createBinder(javax.servlet.http.HttpServletRequest request,
                                                java.lang.Object target,
                                                java.lang.String objectName)
                                         throws java.lang.Exception
Template method for creating a new ServletRequestDataBinder instance.

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

Parameters:
request - current HTTP request
target - the target object to bind onto (or null if the binder is just used to convert a plain parameter value)
objectName - the objectName of the target object
Returns:
the ServletRequestDataBinder instance to use
Throws:
java.lang.Exception - in case of invalid state or arguments
See Also:
ServletRequestDataBinder.bind(javax.servlet.ServletRequest), DataBinder.convertIfNecessary(Object, Class, MethodParameter)