Проверка Spring MVC 3 не будет работать при добавлении атрибутов в модель

#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());

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