Я пытаюсь настроить валидацию Spring на основе простого веб-приложения.Я использую Spring 3.0.5, Tiles 2.2.2.В одном конкретном случае я могу получить ошибку проверки рядом с полем, однако, как только я добавляю какие-либо объекты в модель, она перестает работать.В идеале после POST я хочу перенаправить в GET формы с ошибками проверки.Это настройка:
У меня есть простой объект домена.
public class DomainObject {
@NotEmpty
private String name;
private Date created;
private Date lastModified;
...
}
У меня есть контроллер с методом GET, который добавляет все существующие доменные объекты в модель и возвращает представление, отображающее ихи содержит очень простую форму для их создания.Он также имеет метод 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>
При этой настройке, если я оставлю поле имени пустым, ошибка проверки будетподобран и правильно отображается справа от поля.Однако таблица всегда пуста, поскольку в модель не добавляются никакие объекты.Если я добавляю объекты в модель, раскомментируя строки
//model.addAttribute("objects", domainObjectService.getAll());
//model.addAttribute(new DomainObject());
, таблица заполняется, но ошибка проверки больше не появляется.Я не могу разобраться с этим.
Как еще один нежелательный побочный эффект, любые относительные ссылки, которые у меня есть в представлении, теперь больше не работают (например, ссылка, которая изменяет локаль href = "? Lang = de").
Итак, что может вызвать исчезновение сообщения проверки при добавлении данных в модель?И могу ли я перенаправить на исходную форму, сохраняя при этом сообщения проверки?
Спасибо,
Рассел