最近我试图了解spring如何处理@Valid注释。例如,查看以下控制器的方法:
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ModelAndView createEmployee(@Valid EmployeeForm form, Errors errors) {
if(errors.hasErrors()) {
//validation errors
}
//method code
}
我很难理解errors
实例如何实时填充验证错误。在编译控制器期间,Spring是否会在createEmployee方法的开头注入负责验证的代码?如果是这样的代码看起来如何?
我真的试图找到一个在现实生活中如何进行验证的例子,但这是不可能的。请帮帮我。
答案 0 :(得分:1)
一切都在运行时发生。有关执行验证的详细信息,请参阅reference;有关其他说明,请参阅this post。
基本上这是Spring内部工作方式的一部分。当您启动应用程序时,Spring会注册一些bean,bean处理器,可以扫描类路径中的注释类,注册那些找到注释类,为其中一些构建代理等,并使用它们构建上下文。
处理请求时,请求在某个以DispatcherServlet
开头的预定执行路径上处理,根据需要从上下文中获取其他bean来处理请求(例如验证)然后转发给您createEmployee
中的控制器(由于Spring在您的控制器上找到了@RequestMapping
注释,因此已注册为启动)。当您从方法返回时,流程将继续构建模型,选择要显示的视图,然后生成对客户端的响应。
对于您的示例,Spring基本上找到@Valid
注释,查找已配置的验证器(由您或由提供的实现配置,例如JSR-303),运行验证器并将验证结果存储在Errors
对象。它在处理请求时执行此操作,如上所述,它不会生成代码。
如果您的问题是完全知道Spring如何做到这一点,那么在所有细节中,您可以使用Spring源代码并查看/调试它。