#validation #spring-mvc #annotations #spring-3
#проверка #spring-mvc #примечания #spring-3
Вопрос:
Я пытаюсь заставить проверку на основе аннотаций Spring работать в простом веб-приложении. Я использую Spring 3.0.5, Tiles 2.2.2. В одном конкретном случае я могу получить сообщение об ошибке проверки рядом с полем, однако, как только я добавляю какие-либо объекты в модель, она перестает работать. В идеале, после ПУБЛИКАЦИИ я хочу перенаправить на ПОЛУЧЕНИЕ формы с включенными ошибками проверки. Это настройка:
У меня есть простой доменный объект.
public class DomainObject {
@NotEmpty
private String name;
private Date created;
private Date lastModified;
...
}
У меня есть контроллер с методом GET, который добавляет все существующие DomainObjects в модель и возвращает представление, которое их отображает, и содержит очень простую форму для их создания. В нем также есть метод POST для создания нового DomainObject.
@Controller
@RequestMapping("/")
public class DomainObjectController {
@Autowired
private DomainObjectService domainObjectService;
@RequestMapping("form.htm")
public String home(Model model) {
model.addAttribute("objects", domainObjectService.getAll());
model.addAttribute(new DomainObject());
return "form";
}
@RequestMapping(value="new_object.do", method=RequestMethod.POST)
public String newObject(@Valid DomainObject domainObject, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
//model.addAttribute("objects", domainObjectService.getAll());
//model.addAttribute(new DomainObject());
return "form";
}
domainObjectService.saveNew(domainObject);
model.addAttribute("objects", domainObjectService.getAll());
model.addAttribute(new DomainObject());
return "form";
}
}
Вот представление:
<form:form commandName="domainObject" action="new_object.do" method="post>
<spring:message code="name" />: <form:input path="name" />
<input type="submit" value="<spring:message code="create.object"/>" /><form:errors path="name" cssClass="error"/></form:form>
</div>
<table class="centered">
<col width=50 />
<col width=225 />
<col width=200 />
<col width=200 />
<thead>
<tr>
<td id="id" class="sortable"><spring:message code="id" /></td>
<td id="name" class="sortable"><spring:message code="name" /></td>
<td id="created" class="sortable"><spring:message code="created" /></td>
</tr>
</thead>
<tbody>
<c:forEach var="obj" items="${objects}">
<tr>
<td class="id">${obj.id}</td>
<td>${obj.name}</td>
<td>${obj.created}</td>
</tr>
</c:forEach>
</tbody>
</table>
При такой настройке, если я оставлю поле name пустым, ошибка проверки будет обнаружена и корректно отобразится справа от поля. Однако таблица всегда пуста, поскольку в модель не добавляются объекты. Если я добавлю объекты в модель, раскомментировав строки
//model.addAttribute("objects", domainObjectService.getAll());
//model.addAttribute(new DomainObject());
таблица заполнена, но ошибка проверки больше не появляется. Я не могу разобраться с этим.
В качестве другого нежелательного побочного эффекта любые относительные ссылки, которые у меня есть в представлении, теперь больше не работают (например, ссылка, которая изменяет языковой стандарт href=»?lang=de»).
Итак, что может быть причиной исчезновения сообщения о проверке при добавлении данных в модель? И возможно ли для меня перенаправить на исходную форму, сохраняя сообщения проверки?
Спасибо,
Рассел
Комментарии:
1. Нет ничего лучше, чем задать вопрос, который приведет вас к ответу. Похоже, что при добавлении нового DomainObject() в модель во время метода POST я сбрасывал ошибки проверки. Удалите эту строку, и таблица была заполнена, а ошибка проверки все еще появляется. Мне было бы интересно узнать, что происходило за кулисами, если кто-нибудь может мне сказать. Я также решил проблему относительных URL-адресов, заставив оба метода запрашивать одно и то же сопоставление URL-адресов, только один с GET и один с POST .
Ответ №1:
Ошибка проверки связана с недопустимым объектом. Если вы замените недействительный объект на новый:
model.addAttribute(
new
DomainObject());
тогда сообщения об ошибках не будут прикреплены к этому объекту.