Spring's Request Mapping Parameter Binding Mechanism

Parameter Binding Sources

When processing controller requests, Spring MVC must bind values to method parameters from multiple sources:

  • Request parameters (URL query strings, request body, headers)
  • Cookies
  • Session attributes
  • Flash attributes (for redirect scenarios)
  • Session attributes declared via @SessionAttribute
  • Attributes set by @ModelAttribute methods

Binding Implementation

Parameter resolution is handled by HandlerMethodArgumentResolver implementations. The framework uses a composite resolvre that sequentially attempts each resolver until one handles the parameter type. This mechanism also applies to @ModelAttribute and @InitBinder methods.

RequestMappingHandlerAdapter Initialization

The adapter initializes three key components during setup:

  1. Arguement resolvers for handler methods
  2. Init binder resolvers for @InitBinder methods
  3. Return value handlers

Here's the initialization process for argument resolvers:

private List<HandlerMethodArgumentResolver> createDefaultResolvers() {
    List<HandlerMethodArgumentResolver> resolverComponents = new ArrayList<>();
    
    // Annotation-based resolvers
    resolverComponents.add(new RequestParamResolver(beanFactory, false));
    resolverComponents.add(new RequestParamMapResolver());
    resolverComponents.add(new PathVariableResolver());
    resolverComponents.add(new PathVariableMapResolver());
    resolverComponents.add(new MatrixVariableResolver());
    resolverComponents.add(new MatrixVariableMapResolver());
    resolverComponents.add(new ServletModelResolver(false));
    resolverComponents.add(new RequestBodyProcessor(messageConverters, requestAdvice));
    
    // Type-based resolvers
    resolverComponents.add(new ServletRequestResolver());
    resolverComponents.add(new ServletResponseResolver());
    resolverComponents.add(new HttpEntityProcessor(messageConverters, requestAdvice));
    resolverComponents.add(new RedirectAttributesResolver());
    resolverComponents.add(new ModelProcessor());
    
    // Catch-all handlers
    resolverComponents.add(new RequestParamResolver(beanFactory, true));
    resolverComponents.add(new ServletModelResolver(true));
    
    return resolverComponents;
}

Request Processing Flow

When handling a request, the adapter:

  1. Creates a ServletInvocableHandlerMethod instance
  2. Configrues parameter resolvers and return handlers
  3. Processes @ModelAttribute and @InitBinder methods
  4. Resolves method parameters via the resolver chain
  5. Invokes the controller method
  6. Processes the return value

Parameter resolution occurs through the composite resolver's supportsParameter and resolveArgument methods. The resolver cache optimizes repeated parameter handling:

public Object resolveArgument(MethodParameter parameter, 
                             ModelAndViewContainer container,
                             NativeWebRequest request,
                             DataBinderFactory binderFactory) {
    HandlerMethodArgumentResolver resolver = getResolver(parameter);
    return resolver.resolveArgument(parameter, container, request, binderFactory);
}

private HandlerMethodArgumentResolver getResolver(MethodParameter parameter) {
    HandlerMethodArgumentResolver resolver = resolverCache.get(parameter);
    if (resolver == null) {
        for (HandlerMethodArgumentResolver candidate : argumentResolvers) {
            if (candidate.supportsParameter(parameter)) {
                resolver = candidate;
                resolverCache.put(parameter, resolver);
                break;
            }
        }
    }
    return resolver;
}

Tags: spring-mvc request-mapping handler-method-argument-resolver model-binding parameter-binding

Posted on Sun, 12 Jul 2026 17:28:40 +0000 by szym9341