org.springframework.web.method.annotation

## Class AbstractNamedValueMethodArgumentResolver

- java.lang.Object
- - org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver

- All Implemented Interfaces:
    HandlerMethodArgumentResolver
  Direct Known Subclasses:
    AbstractCookieValueMethodArgumentResolver, ExpressionValueMethodArgumentResolver, MatrixVariableMethodArgumentResolver, PathVariableMethodArgumentResolver, RequestAttributeMethodArgumentResolver, RequestHeaderMethodArgumentResolver, RequestParamMethodArgumentResolver, SessionAttributeMethodArgumentResolver

      public abstract class AbstractNamedValueMethodArgumentResolver
      extends Object
      implements HandlerMethodArgumentResolver

  Abstract base class for resolving method arguments from a named value. Request parameters, request headers, and path variables are examples of named values. Each may have a name, a required flag, and a default value.

  Subclasses define how to do the following:

  - Obtain named value information for a method parameter
  - Resolve names into argument values
  - Handle missing argument values when argument values are required
  - Optionally handle a resolved value

  A default value string can contain ${...} placeholders and Spring Expression Language #{...} expressions. For this to work a `ConfigurableBeanFactory` must be supplied to the class constructor.

  A `WebDataBinder` is created to apply type conversion to the resolved argument value if it doesn't match the method parameter type.

  Since:
    3.1
  Author:
    Arjen Poutsma, Rossen Stoyanchev, Juergen Hoeller

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `protected static class` | `AbstractNamedValueMethodArgumentResolver.NamedValueInfo` Represents the information about a named value, including name, whether it's required and a default value.

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `AbstractNamedValueMethodArgumentResolver()`
    `AbstractNamedValueMethodArgumentResolver(ConfigurableBeanFactory beanFactory)` Create a new `AbstractNamedValueMethodArgumentResolver` instance.

  - ### Method Summary

    All Methods Instance Methods Abstract Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected abstract AbstractNamedValueMethodArgumentResolver.NamedValueInfo` | `createNamedValueInfo(MethodParameter parameter)` Create the `AbstractNamedValueMethodArgumentResolver.NamedValueInfo` object for the given method parameter.
    `protected void` | `handleMissingValue(String name, MethodParameter parameter)` Invoked when a named value is required, but `resolveName(String, MethodParameter, NativeWebRequest)` returned `null` and there is no default value.
    `protected void` | `handleMissingValue(String name, MethodParameter parameter, NativeWebRequest request)` Invoked when a named value is required, but `resolveName(String, MethodParameter, NativeWebRequest)` returned `null` and there is no default value.
    `protected void` | `handleMissingValueAfterConversion(String name, MethodParameter parameter, NativeWebRequest request)` Invoked when a named value is present but becomes `null` after conversion.
    `protected void` | `handleResolvedValue(Object arg, String name, MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest)` Invoked after a value is resolved.
    `Object` | `resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)` Resolves a method parameter into an argument value from a given request.
    `protected abstract Object` | `resolveName(String name, MethodParameter parameter, NativeWebRequest request)` Resolve the given parameter type and value name into an argument value.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface org.springframework.web.method.support.HandlerMethodArgumentResolver

      `supportsParameter`

- - ### Constructor Detail

    - #### AbstractNamedValueMethodArgumentResolver

          public AbstractNamedValueMethodArgumentResolver()

    - #### AbstractNamedValueMethodArgumentResolver

          public AbstractNamedValueMethodArgumentResolver(@Nullable
                                                          ConfigurableBeanFactory beanFactory)

      Create a new `AbstractNamedValueMethodArgumentResolver` instance.
      Parameters:
        `beanFactory` - a bean factory to use for resolving ${...} placeholder and #{...} SpEL expressions in default values, or `null` if default values are not expected to contain expressions

  - ### Method Detail

    - #### resolveArgument

          @Nullable
          public final Object resolveArgument(MethodParameter parameter,
                                                        @Nullable
                                                        ModelAndViewContainer mavContainer,
                                                        NativeWebRequest webRequest,
                                                        @Nullable
                                                        WebDataBinderFactory binderFactory)
                                                 throws Exception

      Description copied from interface: `HandlerMethodArgumentResolver`
      Resolves a method parameter into an argument value from a given request. A `ModelAndViewContainer` provides access to the model for the request. A `WebDataBinderFactory` provides a way to create a `WebDataBinder` instance when needed for data binding and type conversion purposes.
      Specified by:
        `resolveArgument` in interface `HandlerMethodArgumentResolver`
      Parameters:
        `parameter` - the method parameter to resolve. This parameter must have previously been passed to `HandlerMethodArgumentResolver.supportsParameter(org.springframework.core.MethodParameter)` which must have returned `true`.
        `mavContainer` - the ModelAndViewContainer for the current request
        `webRequest` - the current request
        `binderFactory` - a factory for creating `WebDataBinder` instances
      Returns:
        the resolved argument value, or `null` if not resolvable
      Throws:
        `Exception` - in case of errors with the preparation of argument values

    - #### createNamedValueInfo

          protected abstract AbstractNamedValueMethodArgumentResolver.NamedValueInfo createNamedValueInfo(MethodParameter parameter)

      Create the `AbstractNamedValueMethodArgumentResolver.NamedValueInfo` object for the given method parameter. Implementations typically retrieve the method annotation by means of `MethodParameter.getParameterAnnotation(Class)`.
      Parameters:
        `parameter` - the method parameter
      Returns:
        the named value information

    - #### resolveName

          @Nullable
          protected abstract Object resolveName(String name,
                                                          MethodParameter parameter,
                                                          NativeWebRequest request)
                                                   throws Exception

      Resolve the given parameter type and value name into an argument value.
      Parameters:
        `name` - the name of the value being resolved
        `parameter` - the method parameter to resolve to an argument value (pre-nested in case of a `Optional` declaration)
        `request` - the current request
      Returns:
        the resolved argument (may be `null`)
      Throws:
        `Exception` - in case of errors

    - #### handleMissingValue

          protected void handleMissingValue(String name,
                                            MethodParameter parameter,
                                            NativeWebRequest request)
                                     throws Exception

      Invoked when a named value is required, but `resolveName(String, MethodParameter, NativeWebRequest)` returned `null` and there is no default value. Subclasses typically throw an exception in this case.
      Parameters:
        `name` - the name for the value
        `parameter` - the method parameter
        `request` - the current request
      Throws:
        `Exception`
      Since:
        4.3

    - #### handleMissingValue

          protected void handleMissingValue(String name,
                                            MethodParameter parameter)
                                     throws ServletException

      Invoked when a named value is required, but `resolveName(String, MethodParameter, NativeWebRequest)` returned `null` and there is no default value. Subclasses typically throw an exception in this case.
      Parameters:
        `name` - the name for the value
        `parameter` - the method parameter
      Throws:
        `ServletException`

    - #### handleMissingValueAfterConversion

          protected void handleMissingValueAfterConversion(String name,
                                                           MethodParameter parameter,
                                                           NativeWebRequest request)
                                                    throws Exception

      Invoked when a named value is present but becomes `null` after conversion.
      Parameters:
        `name` - the name for the value
        `parameter` - the method parameter
        `request` - the current request
      Throws:
        `Exception`
      Since:
        5.3.6

    - #### handleResolvedValue

          protected void handleResolvedValue(@Nullable
                                             Object arg,
                                             String name,
                                             MethodParameter parameter,
                                             @Nullable
                                             ModelAndViewContainer mavContainer,
                                             NativeWebRequest webRequest)

      Invoked after a value is resolved.
      Parameters:
        `arg` - the resolved argument value
        `name` - the argument name
        `parameter` - the argument parameter type
        `mavContainer` - the `ModelAndViewContainer` (may be `null`)
        `webRequest` - the current request