>我最近浏览了春季 MVC 文档,并在 DispatcherServlet 下了解下面的请求处理流程
1(创建请求上下文
2(找到在 准备的处理程序/处理者映射 上下文启动
3(Exceute 拦截器 preHandler 方法(如果已配置
4(执行处理程序/控制器方法
5(Exceute Interceptors postHandler 方法(如果已配置
6(处理异常(如果有(
(七((渲染视图
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 将数据从请求绑定到模型和 userDetail 对象?
同样,在什么时候,dispacherservlet 会触发对使用有效注释注释的 UserDetail 对象的验证?
更新:- 假设我已经在控制器方法下设置了自定义验证器,如下所示。现在在什么时间点customValidation
InitBinder
将被执行?
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(customValidator);
}
在步骤 3 和 4 之间。数据绑定由参数解析器处理。这些还负责验证。
在您的示例中,您有参数 @valid UserDetail userDetail
。Spring 用于该参数的默认解析器是 ServletModelAttributeMethodProcessor
。它将传入的表单数据绑定到UserDetail
实例,如果存在@Valid
或@Validated
注释,则还会验证对象。这意味着验证不是一个单独的步骤,而是由参数解析器处理或根本不处理。
执行所有参数解析器后,将使用解析的参数调用处理程序方法。