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对象不可用于我的视图?
欢迎和赞赏任何帮助,它可能会给我一个提示或指出我正确的方向.
该生产线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 的地方