org.springframework.web.method.annotation

Class ModelAttributeMethodProcessor

  • java.lang.Object
    • org.springframework.web.method.annotation.ModelAttributeMethodProcessor
  • All Implemented Interfaces:
    HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler
    Direct Known Subclasses:
    ServletModelAttributeMethodProcessor


    public class ModelAttributeMethodProcessor
    extends java.lang.Object
    implements HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler
    Resolve @ModelAttribute annotated method arguments and handle return values from @ModelAttribute annotated methods.

    Model attributes are obtained from the model or created with a default constructor (and then added to the model). Once created the attribute is populated via data binding to Servlet request parameters. Validation may be applied if the argument is annotated with @javax.validation.Valid. or Spring's own @org.springframework.validation.annotation.Validated.

    When this handler is created with annotationNotRequired=true any non-simple type argument and return value is regarded as a model attribute with or without the presence of an @ModelAttribute.

    Since:
    3.1
    Author:
    Rossen Stoyanchev, Juergen Hoeller, Sebastien Deleuze
    • Field Detail

      • logger

        protected final Log logger
    • Constructor Detail

      • ModelAttributeMethodProcessor

        public ModelAttributeMethodProcessor(boolean annotationNotRequired)
        Class constructor.
        Parameters:
        annotationNotRequired - if "true", non-simple method arguments and return values are considered model attributes with or without a @ModelAttribute annotation
    • Method Detail

      • supportsParameter

        public boolean supportsParameter(MethodParameter parameter)
        Returns true if the parameter is annotated with ModelAttribute or, if in default resolution mode, for any method parameter that is not a simple type.
        Specified by:
        supportsParameter in interface HandlerMethodArgumentResolver
        Parameters:
        parameter - the method parameter to check
        Returns:
        true if this resolver supports the supplied parameter; false otherwise
      • createAttribute

        protected java.lang.Object createAttribute(java.lang.String attributeName,
                                                   MethodParameter parameter,
                                                   WebDataBinderFactory binderFactory,
                                                   NativeWebRequest webRequest)
                                            throws java.lang.Exception
        Extension point to create the model attribute if not found in the model, with subsequent parameter binding through bean properties (unless suppressed).

        The default implementation typically uses the unique public no-arg constructor if available but also handles a "primary constructor" approach for data classes: It understands the JavaBeans ConstructorProperties annotation as well as runtime-retained parameter names in the bytecode, associating request parameters with constructor arguments by name. If no such constructor is found, the default constructor will be used (even if not public), assuming subsequent bean property bindings through setter methods.

        Parameters:
        attributeName - the name of the attribute (never null)
        parameter - the method parameter declaration
        binderFactory - for creating WebDataBinder instance
        webRequest - the current request
        Returns:
        the created model attribute (never null)
        Throws:
        BindException - in case of constructor argument binding failure
        java.lang.Exception - in case of constructor invocation failure
        See Also:
        constructAttribute(Constructor, String, MethodParameter, WebDataBinderFactory, NativeWebRequest), BeanUtils.findPrimaryConstructor(Class)
      • constructAttribute

        protected java.lang.Object constructAttribute(java.lang.reflect.Constructor<?> ctor,
                                                      java.lang.String attributeName,
                                                      MethodParameter parameter,
                                                      WebDataBinderFactory binderFactory,
                                                      NativeWebRequest webRequest)
                                               throws java.lang.Exception
        Construct a new attribute instance with the given constructor.

        Called from createAttribute(String, MethodParameter, WebDataBinderFactory, NativeWebRequest) after constructor resolution.

        Parameters:
        ctor - the constructor to use
        attributeName - the name of the attribute (never null)
        binderFactory - for creating WebDataBinder instance
        webRequest - the current request
        Returns:
        the created model attribute (never null)
        Throws:
        BindException - in case of constructor argument binding failure
        java.lang.Exception - in case of constructor invocation failure
        Since:
        5.1
      • bindRequestParameters

        protected void bindRequestParameters(WebDataBinder binder,
                                             NativeWebRequest request)
        Extension point to bind the request to the target object.
        Parameters:
        binder - the data binder instance to use for the binding
        request - the current request
      • isBindExceptionRequired

        protected boolean isBindExceptionRequired(MethodParameter parameter)
        Whether to raise a fatal bind exception on validation errors.
        Parameters:
        parameter - the method parameter declaration
        Returns:
        true if the next method parameter is not of type Errors
        Since:
        5.0
      • supportsReturnType

        public boolean supportsReturnType(MethodParameter returnType)
        Return true if there is a method-level @ModelAttribute or, in default resolution mode, for any return value type that is not a simple type.
        Specified by:
        supportsReturnType in interface HandlerMethodReturnValueHandler
        Parameters:
        returnType - the method return type to check
        Returns:
        true if this handler supports the supplied return type; false otherwise