如何使用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)
没有它你得到一个错误的请求,有了它,请求将实际到达方法,如果设置为调试级别,日志将显示确切的绑定错误