如何使用 Spring MVC JSR-303 验证器将不同模型 class 验证为一种形式
How to Validate different model class into one form using Spring MVC JSR-303 Validator
我在 jsp
页面中有如下表格:
<springForm:form action="${addAction}" name="frm" method="post" commandName="employee">
<table>
<tr>
<td><label>First Name</label> </td>
<td><springForm:input path="firstName" /></td>
<td><springForm:errors path="firstName" cssClass="error" /></td>
</tr>
<tr>
<td><label>Last Name</label></td>
<td><springForm:input path="lastName" /></td>
<td><springForm:errors path="lastName" cssClass="error" /></td>
</tr>
<tr>
<td><label>Email</label> </td>
<td><springForm:input path="email" /></td>
<td><springForm:errors path="email" cssClass="error" /></td>
</tr>
<tr>
<td><label>Street</label> </td>
<td><springForm:input path="employeeDetail.street" /></td>
<td><springForm:errors path="employeeDetail.street" cssClass="error" /></td>
</tr>
<tr>
<td><label>City</label> </td>
<td><springForm:input path="employeeDetail.city" /></td>
<td><springForm:errors path="employeeDetail.city" cssClass="error" /></td>
</tr>
<tr>
<td><label>State</label> </td>
<td><springForm:input path="employeeDetail.state" /></td>
<td><springForm:errors path="employeeDetail.state" cssClass="error" /></td>
</tr>
<tr>
<td><label>Country</label> </td>
<td><springForm:input path="employeeDetail.country" /></td>
<td><springForm:errors path="employeeDetail.country" cssClass="error" /></td>
</tr>
<tr>
<td colspan="2" style="text-align: center;">
<input type="submit" value="Add Info" />
</td>
</tr>
</table>
</springForm:form>
在此 jsp 中,名字、姓氏和电子邮件属于模型 class,即员工。
最后所有属性,如 Street、City 等都属于 EmployeeDetails 模型 class。
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
}
员工详情:
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
}
我正在单个表单中对两个模型执行验证。我的 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
}
但是收到 Bad Request 没有用。
您应该将属于 EmployeeDetail
的属性名称从例如name="street"
至 name="employeeDetail.street"
另外,你也应该在Employee
参数后面添加一个BindingResult
对象,这样框架可以存储与Employee相关的绑定错误,当前的BindingResult将只适用于EmployeeDetail
实例,所以
saveEmployee(@Valid Employee employee, BindingResult bindingResultEmployee,
@Valid EmployeeDetail employeeDetail, BindingResult bindingResult)
没有它你会得到一个错误的请求,有了它,请求实际上会到达方法,如果设置为调试级别,日志将显示确切的绑定错误
要完成这项工作,您应该在 Employee.class 中使用 @Valid 注释 employeeDetails,如下所示:
@Valid
private EmployeeDetail employeeDetail;
现在在控制器中你应该像这样使用 Employee 对象:
public String saveEmployee(@Valid Employee employee, BindingResult bindingResult) {
我在 jsp
页面中有如下表格:
<springForm:form action="${addAction}" name="frm" method="post" commandName="employee">
<table>
<tr>
<td><label>First Name</label> </td>
<td><springForm:input path="firstName" /></td>
<td><springForm:errors path="firstName" cssClass="error" /></td>
</tr>
<tr>
<td><label>Last Name</label></td>
<td><springForm:input path="lastName" /></td>
<td><springForm:errors path="lastName" cssClass="error" /></td>
</tr>
<tr>
<td><label>Email</label> </td>
<td><springForm:input path="email" /></td>
<td><springForm:errors path="email" cssClass="error" /></td>
</tr>
<tr>
<td><label>Street</label> </td>
<td><springForm:input path="employeeDetail.street" /></td>
<td><springForm:errors path="employeeDetail.street" cssClass="error" /></td>
</tr>
<tr>
<td><label>City</label> </td>
<td><springForm:input path="employeeDetail.city" /></td>
<td><springForm:errors path="employeeDetail.city" cssClass="error" /></td>
</tr>
<tr>
<td><label>State</label> </td>
<td><springForm:input path="employeeDetail.state" /></td>
<td><springForm:errors path="employeeDetail.state" cssClass="error" /></td>
</tr>
<tr>
<td><label>Country</label> </td>
<td><springForm:input path="employeeDetail.country" /></td>
<td><springForm:errors path="employeeDetail.country" cssClass="error" /></td>
</tr>
<tr>
<td colspan="2" style="text-align: center;">
<input type="submit" value="Add Info" />
</td>
</tr>
</table>
</springForm:form>
在此 jsp 中,名字、姓氏和电子邮件属于模型 class,即员工。 最后所有属性,如 Street、City 等都属于 EmployeeDetails 模型 class。
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
}
员工详情:
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
}
我正在单个表单中对两个模型执行验证。我的 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
}
但是收到 Bad Request 没有用。
您应该将属于 EmployeeDetail
的属性名称从例如name="street"
至 name="employeeDetail.street"
另外,你也应该在Employee
参数后面添加一个BindingResult
对象,这样框架可以存储与Employee相关的绑定错误,当前的BindingResult将只适用于EmployeeDetail
实例,所以
saveEmployee(@Valid Employee employee, BindingResult bindingResultEmployee,
@Valid EmployeeDetail employeeDetail, BindingResult bindingResult)
没有它你会得到一个错误的请求,有了它,请求实际上会到达方法,如果设置为调试级别,日志将显示确切的绑定错误
要完成这项工作,您应该在 Employee.class 中使用 @Valid 注释 employeeDetails,如下所示:
@Valid
private EmployeeDetail employeeDetail;
现在在控制器中你应该像这样使用 Employee 对象:
public String saveEmployee(@Valid Employee employee, BindingResult bindingResult) {