我最近通过Spring MVC doc并在DispatcherServlet下了解下面的请求处理流程
1)创建请求上下文
2)通过处理程序映射找到处理程序/控制器映射 上下文启动
3)Exceute Interceptors preHandler方法(如果已配置)
4)执行Handler / Conroller方法
5)如果配置了
,则为Exceute Interceptors postHandler方法6)处理异常(如果有的话)
7)渲染视图
8)如果配置完成后,可以使用完成后的拦截器
现在我有以下方法
@RequestMapping(value="/userHistory", method=RequestMethod.GET)
public @ResponseBody UserDetails getUserHistory(Model model, @valid UserDetail userDetail HttpServletRequest request, HttpServletResponse response) {
model.addAttribute("userDetail", new userDetail());
}
我的问题是在上述请求处理流程的哪个时间点,DispatcherServlet将数据从请求绑定到model和userDetail对象?
同样,dispacherservlet在什么时候触发使用有效注释注释的UserDetail对象的验证?
更新: - 假设我已经在这样的控制器方法下设置了customValidator。现在什么时候customValidation
并且InitBinder
将被执行?
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(customValidator);
}
答案 0 :(得分:0)
在步骤3和4之间。数据绑定由参数解析器处理。那些人也负责验证。
在您的示例中,您有参数@valid UserDetail userDetail
。 Spring为该参数使用的默认解析器是ServletModelAttributeMethodProcessor
。它将传入的表单数据绑定到UserDetail
实例,如果存在@Valid
或@Validated
注释,它还会验证该对象。这意味着验证不是一个单独的步骤,而是由参数解析器处理或根本不处理。
在执行了所有参数解析器之后,使用已解析的参数调用处理程序方法。