org.springframework.web.method.support
Class InvocableHandlerMethod

java.lang.Object
  extended by org.springframework.web.method.HandlerMethod
      extended by org.springframework.web.method.support.InvocableHandlerMethod
Direct Known Subclasses:
ServletInvocableHandlerMethod

public class InvocableHandlerMethod
extends HandlerMethod

Provides a method for invoking the handler method for a given request after resolving its method argument values through registered HandlerMethodArgumentResolvers.

Argument resolution often requires a WebDataBinder for data binding or for type conversion. Use the setDataBinderFactory(WebDataBinderFactory) property to supply a binder factory to pass to argument resolvers.

Use setHandlerMethodArgumentResolvers(HandlerMethodArgumentResolverComposite) to customize the list of argument resolvers.

Since:
3.1
Author:
Rossen Stoyanchev

Field Summary
private  HandlerMethodArgumentResolverComposite argumentResolvers
           
private  WebDataBinderFactory dataBinderFactory
           
private  ParameterNameDiscoverer parameterNameDiscoverer
           
 
Fields inherited from class org.springframework.web.method.HandlerMethod
logger
 
Constructor Summary
InvocableHandlerMethod(java.lang.Object bean, java.lang.reflect.Method method)
          Constructs a new handler method with the given bean instance and method.
InvocableHandlerMethod(java.lang.Object bean, java.lang.String methodName, java.lang.Class<?>... parameterTypes)
          Constructs a new handler method with the given bean instance, method name and parameters.
 
Method Summary
private  java.lang.String getArgumentResolutionErrorMessage(java.lang.String message, int index)
           
protected  java.lang.String getDetailedErrorMessage(java.lang.String message)
          Adds HandlerMethod details such as the controller type and method signature to the given error message.
private  java.lang.String getInvocationErrorMessage(java.lang.String message, java.lang.Object[] resolvedArgs)
           
private  java.lang.Object[] getMethodArgumentValues(NativeWebRequest request, ModelAndViewContainer mavContainer, java.lang.Object... providedArgs)
          Get the method argument values for the current request.
private  java.lang.Object invoke(java.lang.Object... args)
          Invoke the handler method with the given argument values.
 java.lang.Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer, java.lang.Object... providedArgs)
          Invoke the method after resolving its argument values in the context of the given request.
private  java.lang.Object resolveProvidedArgument(MethodParameter parameter, java.lang.Object... providedArgs)
          Attempt to resolve a method parameter from the list of provided argument values.
 void setDataBinderFactory(WebDataBinderFactory dataBinderFactory)
          Sets the WebDataBinderFactory to be passed to argument resolvers allowing them to create a WebDataBinder for data binding and type conversion purposes.
 void setHandlerMethodArgumentResolvers(HandlerMethodArgumentResolverComposite argumentResolvers)
          Set HandlerMethodArgumentResolvers to use to use for resolving method argument values.
 void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer)
          Set the ParameterNameDiscoverer for resolving parameter names when needed (e.g.
 
Methods inherited from class org.springframework.web.method.HandlerMethod
createWithResolvedBean, equals, getBean, getBeanType, getBridgedMethod, getMethod, getMethodAnnotation, getMethodParameters, getReturnType, hashCode, isVoid, toString
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

argumentResolvers

private HandlerMethodArgumentResolverComposite argumentResolvers

dataBinderFactory

private WebDataBinderFactory dataBinderFactory

parameterNameDiscoverer

private ParameterNameDiscoverer parameterNameDiscoverer
Constructor Detail

InvocableHandlerMethod

public InvocableHandlerMethod(java.lang.Object bean,
                              java.lang.reflect.Method method)
Constructs a new handler method with the given bean instance and method.

Parameters:
bean - the bean instance
method - the method

InvocableHandlerMethod

public InvocableHandlerMethod(java.lang.Object bean,
                              java.lang.String methodName,
                              java.lang.Class<?>... parameterTypes)
                       throws java.lang.NoSuchMethodException
Constructs a new handler method with the given bean instance, method name and parameters.

Parameters:
bean - the object bean
methodName - the method name
parameterTypes - the method parameter types
Throws:
java.lang.NoSuchMethodException - when the method cannot be found
Method Detail

setDataBinderFactory

public void setDataBinderFactory(WebDataBinderFactory dataBinderFactory)
Sets the WebDataBinderFactory to be passed to argument resolvers allowing them to create a WebDataBinder for data binding and type conversion purposes.

Parameters:
dataBinderFactory - the data binder factory.

setHandlerMethodArgumentResolvers

public void setHandlerMethodArgumentResolvers(HandlerMethodArgumentResolverComposite argumentResolvers)
Set HandlerMethodArgumentResolvers to use to use for resolving method argument values.


setParameterNameDiscoverer

public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer)
Set the ParameterNameDiscoverer for resolving parameter names when needed (e.g. default request attribute name).

Default is an LocalVariableTableParameterNameDiscoverer instance.


invokeForRequest

public final java.lang.Object invokeForRequest(NativeWebRequest request,
                                               ModelAndViewContainer mavContainer,
                                               java.lang.Object... providedArgs)
                                        throws java.lang.Exception
Invoke the method after resolving its argument values in the context of the given request.

Argument values are commonly resolved through HandlerMethodArgumentResolvers. The provideArgs parameter however may supply argument values to be used directly, i.e. without argument resolution. Examples of provided argument values include a WebDataBinder, a SessionStatus, or a thrown exception instance. Provided argument values are checked before argument resolvers.

Parameters:
request - the current request
mavContainer - the ModelAndViewContainer for the current request
providedArgs - argument values to try to use without view resolution
Returns:
the raw value returned by the invoked method
Throws:
java.lang.Exception - raised if no suitable argument resolver can be found, or the method raised an exception

getMethodArgumentValues

private java.lang.Object[] getMethodArgumentValues(NativeWebRequest request,
                                                   ModelAndViewContainer mavContainer,
                                                   java.lang.Object... providedArgs)
                                            throws java.lang.Exception
Get the method argument values for the current request.

Throws:
java.lang.Exception

getArgumentResolutionErrorMessage

private java.lang.String getArgumentResolutionErrorMessage(java.lang.String message,
                                                           int index)

getDetailedErrorMessage

protected java.lang.String getDetailedErrorMessage(java.lang.String message)
Adds HandlerMethod details such as the controller type and method signature to the given error message.

Parameters:
message - error message to append the HandlerMethod details to

resolveProvidedArgument

private java.lang.Object resolveProvidedArgument(MethodParameter parameter,
                                                 java.lang.Object... providedArgs)
Attempt to resolve a method parameter from the list of provided argument values.


invoke

private java.lang.Object invoke(java.lang.Object... args)
                         throws java.lang.Exception
Invoke the handler method with the given argument values.

Throws:
java.lang.Exception

getInvocationErrorMessage

private java.lang.String getInvocationErrorMessage(java.lang.String message,
                                                   java.lang.Object[] resolvedArgs)