Особенности SpringMVC & @ModelAttribute - PullRequest
2 голосов
/ 04 сентября 2011

Используя 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 в этой ситуации?

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

странно. То же самое работает для меня. Единственное различие, которое я вижу, - порядок Valid и ModelAttribute. Можете ли вы попробовать поменять порядок действительных и ModelAttribute?

public ModelAndView saveFoo(...
   @Valid @ModelAttribute("vo") DescriptionBuilderVO vo, BindingResult result) {
}

Кстати, какую версию пружины вы используете?

0 голосов
/ 14 июля 2013

Попробуйте назвать ваш объект "descriptionBuilderVO", например, следующим образом:

@Valid @ModelAttribute("descriptionBuilderVO") DescriptionBuilderVO descriptionBuilderVO, 
BindingResult result)

Я знаю, что это не должно быть так, но я обнаружил проблемы, когда имя объекта отличается отимя класса.

Обратите внимание, что вам также придется изменить имя объекта в вашем jsp:

<form:form commandName="descriptionBuilderVO" 

... и т.д ...

0 голосов
/ 20 октября 2011

Я пробовал много разных вещей, включая переупорядочение аннотаций Valid и ModelAttribute, и, похоже, это не имеет значения.

При чтении документации, предложенной Пэтом в комментариях, она ссылается на особый контекст, в котором хранится VO. В любом случае, если вы пробуете что-то похожее на это, я предлагаю вам пойти по-другому, возможно, создать совершенно новый виртуальный проект и передать его обратно в представление, что я и сделал.

...