为控制器存储的数据绑定映射在哪里?

时间:2017-01-29 18:17:57

标签: java spring-mvc

在以下控制器中

@Controller
public class MyFormController {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
    // ...
}

该类不继承任何其他类,或者它没有任何WebDataBinder实例变量。那么如何存储自定义编辑器以及在哪里?

1 个答案:

答案 0 :(得分:0)

Spring MVC基础架构很复杂。有许多部分聚集在一起调用您的@Controller处理程序方法。我在答案here中解释了一些内容。

总之,Spring MVC会在@Controller类中扫描@RequestMapping注释方法。它在RequestMappingHandlerMapping中为这些映射创建映射,并使用RequestMappingHandlerAdapter分发给它们,即。调用你的处理程序方法。

在调用该方法之前,它会经历几个内务处理步骤。您可以在源代码here中看到这些内容。简短版本是:

  1. 它将HttpServletRequestHttpServletResponse包装在适配器中。
  2. 它创建了生成ModelWebDataBinder个实例的工厂(后者来自您的@InitBinder方法)。
  3. 它创建一个ServletInvocableHandlerMethod,用HandlerMethodArgumentResolver封装你的处理程序方法的调用,为你的处理程序方法生成参数,并HandlerMethodReturnValueHandler处理你的处理程序方法的返回值。
  4. 它会创建一个ModelAndViewContainer,可能会用于稍后将视图呈现为HTTP响应。
  5. 如果请求使用异步组件,它会准备一个异步环境。
  6. 然后它调用方法。

    您感兴趣的WebDataBinder对象在上述执行上下文中的各个位置存储和使用。