如何使用Spring MVC JSR-303 Validator将不同的模型类validation为一个表单

我在jsp页面中有表格如下:

  

在这个jsp名字,姓氏和电子邮件属于一个模型类,即员工。 最后所有属性如Street,City等属于EmployeeDetails模型类。

 public class Employee { private Long empId; @Size(min=2, max=30) private String firstName; @Size(min=2, max=30) private String lastName; @NotEmpty @Email private String email; @DateTimeFormat(pattern="MM/dd/yyyy") @NotNull @Past private Date doj; @Phone private String phone; private EmployeeDetail employeeDetail; Getter/Setter } 

EmployeeDetail:

 public class EmployeeDetail { @Size(min=2, max=30) private String street; @Size(min=2, max=30) private String city; @Size(min=2, max=30) private String state; @Size(min=2, max=30) private String country; //Getter/Setter } 

我正在单个表单中对两个模型执行validation。 我的Cotroller映射是:

 @RequestMapping(value = "/saveEmpInfo", method = RequestMethod.POST) public String saveEmployee(@Valid Employee employee, @Valid EmployeeDetail employeeDetail, BindingResult bindingResult) { employee.setEmployeeDetail(employeeDetail); if (bindingResult.hasErrors()) { System.out.println("Returning addInfo.jsp page"); return "addInfo"; } //future logic } 

但它没有得到错误的请求。 在此处输入图像描述

要完成这项工作,您应该在Employee.class中使用@Valid注释employeeDetails,如下所示:

 @Valid private EmployeeDetail employeeDetail; 

现在在控制器中你应该只使用这样的Employee对象:

 public String saveEmployee(@Valid Employee employee, BindingResult bindingResult) { 

您应该将属于EmployeeDetail的属性的名称从name="street"更改为name="employeeDetail.street"

另外,你应该在Employee参数后面添加一个BindingResult对象,这样框架就可以存储与Employee相关的绑定错误,当前的BindingResult只适用于EmployeeDetail实例,所以

 saveEmployee(@Valid Employee employee, BindingResult bindingResultEmployee, @Valid EmployeeDetail employeeDetail, BindingResult bindingResult) 

没有它你得到一个错误的请求,有了它,请求将实际到达方法,如果设置为调试级别,日志将显示确切的绑定错误