【问题标题】:How to Validate different model class into one form using Spring MVC JSR-303 Validator如何使用 Spring MVC JSR-303 Validator 将不同的模型类验证为一种形式
【发布时间】:2015-07-22 11:12:03
【问题描述】:

我在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 中,名字、姓氏和电子邮件属于一个模型类,即 Employee。 最后,街道、城市等所有属性都属于 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
}

员工详情:

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
}

我在一个表单中对两个模型执行验证。我的控制器映射是:

@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
}

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

【问题讨论】:

    标签: java spring spring-mvc bean-validation hibernate-validator


    【解决方案1】:

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

    @Valid
    private EmployeeDetail employeeDetail;
    

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

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

    【讨论】:

    • 感谢@jgr 分享您的知识
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 现在它正在工作并获取控制器映射的值。但是当 EmployeeDetail 模型属性为空白时,它不会显示错误。我也包含了
    • 我也编辑了答案,Spring MVC 将实例化嵌套对象并传播验证,无需将EmployeeDetail 标记为单独的参数
    • 不,它不起作用。正如您在前面的回答中提到的,我们需要两个单独的对象用于 EmployeeEmployeeDetail 以及两个 BindingResult 对象。但问题是EmployeeDetail 模型的空白属性没有显示错误消息。
    猜你喜欢
    • 2014-09-09
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2011-07-21
    • 2018-01-30
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多