Spring MVC 3 Validation не будет работать при добавлении атрибутов в модель - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь настроить валидацию 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").

Итак, что может вызвать исчезновение сообщения проверки при добавлении данных в модель?И могу ли я перенаправить на исходную форму, сохраняя при этом сообщения проверки?

Спасибо,

Рассел

1 Ответ

0 голосов
/ 13 апреля 2011

Ошибка проверки прикреплена к недопустимому объекту. Если вы замените недействительный объект на новый:

model.addAttribute(newDomainObject());

тогда сообщения об ошибках не прикрепляются к этому объекту.

...