Используя Spring / SpringMVC 3.0.5, я определил метод в моем контроллере следующим образом:
@RequestMapping(params = { "save","!delete" }, method = RequestMethod.POST)
public ModelAndView saveFoo(...
@ModelAttribute("vo") @Valid DescriptionBuilderVO vo, BindingResult result) {
...
result.rejectValue("foo.sequenceNumber", "foo.builder", new Object[]{vo.getFoo().getSequenceNumber()}, "Sequence Number too high"); vo.getFoo().setSequenceNumber(originalNumber);
return new ModelAndView(WebConstants.VIEW_BUILDER, "vo", vo);
Обратите внимание, что я пытаюсь установить значение в объекте VO внутри контроллера. Самое смешное, что если я сделаю это с @ModelAttribute, новое значение не появится. Если я удалю @ModelAttribute из контракта метода, новое значение будет отображаться именно так, как вы думаете. Проблема возникает, когда есть ошибки, единственный способ получить ошибки - это иметь @ModelAttribute в контракте.
Кстати, мой HTML выглядит так:
HTML
<form:input path="foo.sequenceNumber" id="sequenceNumber" size="4" maxlength="4"/>
<form:errors path="foo.sequenceNumber" cssClass="ui-state-error" />
foo.sequenceNumber = the value the user typed in; when I use @ModelAttribute
foo.sequenceNumber = the value I set in the controller; but I lose any errors
Мне кажется, что SpringMVC помещает ModelAttribute VO в «особое» место и передает его обратно в jsp, но не в очевидном месте. Кто-нибудь знает, как я могу добраться до объекта VO в этой ситуации?