未显示Spring验证错误

Art*_*lay 11 java validation spring spring-mvc

我有以下情况.我有一个验证器来验证我的命令对象,并设置Errors对象上的错误,以便在我的表单中显示.验证器按预期调用并且工作正常,但是当我因验证错误而被发送回我的表单时,我没有显示我在Errors对象上设置的错误.

验证器:

public void validate(Object obj, Errors err) {   
    MyCommand myCommand = (MyCommand) obj;   
    int index = 0;   
    for (Field field : myCommand.getFields()) {   
        if (field.isChecked()) {   
            if ((field.getValue() == null) || (field.getValue().equals(""))) {   
                err.rejectValue("fields[" + index + "].value", "errors.missing");   
            }   
        }   
        index++;   
    }   
    if (myCommand.getLimit() < 0) {   
        err.rejectValue("limit", "errors.invalid");   
    }   
}
Run Code Online (Sandbox Code Playgroud)

命令:

public class MyCommand {   
    private List<Field> fields;   
    private int limit;   

    //getters and setters   
}   

public class Field {   
    private boolean checked;   
    private String name;   
    private String value;   

    //getters and setters   
}
Run Code Online (Sandbox Code Playgroud)

形成:

    <form:form id="myForm" method="POST" action="${url}" commandName="myCommand">   
    <c:forEach items="${myCommand.fields}" var="field" varStatus="status">   
        <form:checkbox path="fields[${status.index}].checked" value="${field.checked}" />   
        <c:out value="${field.name}" />   
        <form:input path="fields[${status.index}].value" />   
        <form:errors path="fields[${status.index}].value" cssClass="error" /></td>   
        <form:hidden path="fields[${status.index}].name" />   
    </c:forEach>   
    <fmt:message key="label.limit" />    
    <form:input path="limit" />   
    <form:errors path="limit" cssClass="error" />   
</form:form>
Run Code Online (Sandbox Code Playgroud)

控制器:

    @RequestMapping(value = REQ_MAPPING, method = RequestMethod.POST)   
    public String onSubmit(Model model, MyCommand myCommand, BindingResult result) {   
    // validate   
    myCommandValidator.validate(myCommand, result);   
    if (result.hasErrors()) {   
        model.addAttribute("myCommand", myCommand);   
        return VIEW;   
    }   

    // form is okay, do stuff and redirect   
}
Run Code Online (Sandbox Code Playgroud)

可能是我在验证器和标签中给出的路径不正确吗?验证器验证包含对象列表的命令对象,这就是为什么我在注册错误消息时在命令对象的列表上给出索引(例如:"fields ["+ index +"]".value).或者是否包含错误的Errors对象不可用于我的视图?

欢迎和赞赏任何帮助,它可能会给我一个提示或指出我正确的方向.

Han*_*eek 1

该生产线err.rejectValue("fields[" + index + "].value", "errors.missing");不会实现您想要实现的目标。第一个参数必须是 Command bean 的属性名称(在您的 case 字段中)。

要给用户一条消息,您必须在属性文件中使用可参数化的消息,例如。myform.field.error = you have an error in field {0}

因此,使用 Errors 对象的此方法:

void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage) 
Run Code Online (Sandbox Code Playgroud)

你传递index给 errorArgs 的地方