Class InvocableShellMethod

java.lang.Object
org.springframework.shell.command.invocation.InvocableShellMethod

public class InvocableShellMethod extends Object
Encapsulates information about a handler method consisting of a method and a bean. Provides convenient access to method parameters, the method return value, method annotations, etc.

The class may be created with a bean instance or with a bean name (e.g. lazy-init bean, prototype bean). Use createWithResolvedBean() to obtain a HandlerMethod instance with a bean instance resolved through the associated BeanFactory.

  • Field Details

    • log

      public static final org.slf4j.Logger log
      Public for wrapping with fallback logger.
  • Constructor Details

    • InvocableShellMethod

      public InvocableShellMethod(Object bean, Method method)
      Create an instance from a bean instance and a method.
    • InvocableShellMethod

      public InvocableShellMethod(Object bean, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException
      Create an instance from a bean instance, method name, and parameter types.
      Throws:
      NoSuchMethodException - when the method cannot be found
    • InvocableShellMethod

      public InvocableShellMethod(String beanName, org.springframework.beans.factory.BeanFactory beanFactory, Method method)
      Create an instance from a bean name, a method, and a BeanFactory. The method createWithResolvedBean() may be used later to re-create the HandlerMethod with an initialized bean.
    • InvocableShellMethod

      protected InvocableShellMethod(InvocableShellMethod handlerMethod)
      Copy constructor for use in subclasses.
  • Method Details

    • setConversionService

      public void setConversionService(org.springframework.core.convert.ConversionService conversionService)
      Sets a conversion service
      Parameters:
      conversionService - the conversion service
    • setValidator

      public void setValidator(jakarta.validation.Validator validator)
    • setMessageMethodArgumentResolvers

      public void setMessageMethodArgumentResolvers(ShellMethodArgumentResolverComposite argumentResolvers)
      Set HandlerMethodArgumentResolvers to use to use for resolving method argument values.
    • setParameterNameDiscoverer

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

      Default is a DefaultParameterNameDiscoverer.

    • invoke

      @Nullable public Object invoke(org.springframework.messaging.Message<?> message, Object... providedArgs) throws Exception
      Invoke the method after resolving its argument values in the context of the given message.

      Argument values are commonly resolved through HandlerMethodArgumentResolvers. The providedArgs parameter however may supply argument values to be used directly, i.e. without argument resolution.

      Delegates to getMethodArgumentValues(org.springframework.messaging.Message<?>, java.lang.Object...) and calls doInvoke(java.lang.Object...) with the resolved arguments.

      Parameters:
      message - the current message being processed
      providedArgs - "given" arguments matched by type, not resolved
      Returns:
      the raw value returned by the invoked method
      Throws:
      Exception - raised if no suitable argument resolver can be found, or if the method raised an exception
      See Also:
    • getMethodArgumentValues

      protected Object[] getMethodArgumentValues(org.springframework.messaging.Message<?> message, Object... providedArgs) throws Exception
      Get the method argument values for the current message, checking the provided argument values and falling back to the configured argument resolvers.

      The resulting array will be passed into doInvoke(java.lang.Object...).

      Throws:
      Exception
    • doInvoke

      @Nullable protected Object doInvoke(Object... args) throws Exception
      Invoke the handler method with the given argument values.
      Throws:
      Exception
    • getBean

      public Object getBean()
      Return the bean for this handler method.
    • getMethod

      public Method getMethod()
      Return the method for this handler method.
    • getBeanType

      public Class<?> getBeanType()
      This method returns the type of the handler for this handler method.

      Note that if the bean type is a CGLIB-generated class, the original user-defined class is returned.

    • getBridgedMethod

      protected Method getBridgedMethod()
      If the bean method is a bridge method, this method returns the bridged (user-defined) method. Otherwise it returns the same method as getMethod().
    • getMethodParameters

      public org.springframework.core.MethodParameter[] getMethodParameters()
      Return the method parameters for this handler method.
    • getReturnType

      public org.springframework.core.MethodParameter getReturnType()
      Return the HandlerMethod return type.
    • getReturnValueType

      public org.springframework.core.MethodParameter getReturnValueType(@Nullable Object returnValue)
      Return the actual return value type.
    • isVoid

      public boolean isVoid()
      Return true if the method return type is void, false otherwise.
    • getMethodAnnotation

      @Nullable public <A extends Annotation> A getMethodAnnotation(Class<A> annotationType)
      Return a single annotation on the underlying method traversing its super methods if no annotation can be found on the given method itself.

      Also supports merged composed annotations with attribute overrides.

      Parameters:
      annotationType - the type of annotation to introspect the method for
      Returns:
      the annotation, or null if none found
      See Also:
      • AnnotatedElementUtils.findMergedAnnotation(java.lang.reflect.AnnotatedElement, java.lang.Class<A>)
    • hasMethodAnnotation

      public <A extends Annotation> boolean hasMethodAnnotation(Class<A> annotationType)
      Return whether the parameter is declared with the given annotation type.
      Parameters:
      annotationType - the annotation type to look for
      See Also:
      • AnnotatedElementUtils.hasAnnotation(java.lang.reflect.AnnotatedElement, java.lang.Class<? extends java.lang.annotation.Annotation>)
    • getResolvedFromHandlerMethod

      @Nullable public InvocableShellMethod getResolvedFromHandlerMethod()
      Return the HandlerMethod from which this HandlerMethod instance was resolved via createWithResolvedBean().
    • createWithResolvedBean

      public InvocableShellMethod createWithResolvedBean()
      If the provided instance contains a bean name rather than an object instance, the bean name is resolved before a InvocableShellMethod is created and returned.
    • getShortLogMessage

      public String getShortLogMessage()
      Return a short representation of this handler method for log message purposes.
    • equals

      public boolean equals(@Nullable Object other)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • findProvidedArgument

      @Nullable protected static Object findProvidedArgument(org.springframework.core.MethodParameter parameter, @Nullable Object... providedArgs)
    • formatArgumentError

      protected static String formatArgumentError(org.springframework.core.MethodParameter param, String message)
    • assertTargetBean

      protected void assertTargetBean(Method method, Object targetBean, Object[] args)
      Assert that the target bean class is an instance of the class where the given method is declared. In some cases the actual endpoint instance at request- processing time may be a JDK dynamic proxy (lazy initialization, prototype beans, and others). Endpoint classes that require proxying should prefer class-based proxy mechanisms.
    • formatInvokeError

      protected String formatInvokeError(String text, Object[] args)