У меня есть следующая ситуация. У меня есть блок проверки допустимости, чтобы проверить мой объект команды и установить ошибки на Ошибочном объекте, который будет отображен в моей форме. Блок проверки допустимости вызывается как ожидалось и работает хорошо, но ошибки, которые я установил на Ошибочных объектах, не отображены, когда меня передают обратно моей форме из-за ошибок проверки.
Блок проверки допустимости:
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");
}
}
Команда:
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
}
Форма:
<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>
Контроллер:
@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
}
Могло случиться так, что пути, которые я даю в блоке проверки допустимости и теге, не корректны? Блок проверки допустимости проверяет объект команды, содержащий список объектов, так вот почему я даю индекс в списке в объекте команды при регистрации сообщения об ошибке (например: "поля [" +index + "]". значение). Или случается так, что Ошибочный объект, содержащий ошибки, не доступен моему представлению?
Любая справка приветствуется и ценится, она могла бы дать мне подсказку или указать на меня в правильном направлении.
Строка err.rejectValue ("fields [" + index + "] .value", "errors.missing");
не будет делать того, чего вы пытаетесь достичь. Первый аргумент должен быть именем свойства вашего Command bean в полях вашего case.
Чтобы дать пользователю сообщение, вам нужно будет использовать параметризуемое сообщение в вашем файле свойств, например. myform.field.error = у вас есть ошибка в поле {0}
Итак, используйте этот метод объекта Errors:
void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage)
Где вы передаете index
в errorArgs
Я обнаружил, в чем ваша проблема.
свойство поля
в объекте myCommand
всегда равны нулю.
Вам необходимо создать конструктор для класса MyCommand, в котором вам нужно использовать LazyList
из Apache Commons или AutoPopulatingList
из Spring, чтобы создать автоматически растущий список Field
В примере (с использованием AutoPopulatingList):
public class MyCommand {
private List<Field> fields;
private int limit;
//getters and setters
//...
//Constructor
public MyCommand() {
fields = new AutoPopulatingList<Field>(Field.class);
}
}