Java 如何使用Spring MVC JSR-303验证器将不同的模型类验证为一个表单

Java 如何使用Spring MVC JSR-303验证器将不同的模型类验证为一个表单,java,spring,spring-mvc,bean-validation,hibernate-validator,Java,Spring,Spring Mvc,Bean Validation,Hibernate Validator,我在jsp页面中有如下表单: <springForm:form action="${addAction}" name="frm" method="post" commandName="employee"> <table> <tr> <td><label>First Name</label> </td> <td><spri

我在
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>
雇员详情:

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
}

但是收到错误的请求并不起作用。

您应该将属于
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;
public String saveEmployee(@Valid Employee employee, BindingResult bindingResult) {
现在在控制器中,您应该只使用Employee对象,如下所示:

@Valid
private EmployeeDetail employeeDetail;
public String saveEmployee(@Valid Employee employee, BindingResult bindingResult) {

现在,它正在工作并获取控制器映射上的值。但是当EmployeeDetail模型属性为空时,它不会显示错误。我也包括了。我也编辑了答案,Spring MVC将实例化嵌套对象并传播验证,没有必要将
EmployeeDetail
标记为单独的参数。不,它不起作用。我们需要为
Employee
EmployeeDetail
使用两个
BindingResult
对象的两个独立对象,正如您在前面的回答中提到的。但是问题是,错误代码没有显示给模型的空白属性。谢谢@ JGR分享您的知识。