2011-09-04 56 views
2

使用Spring/3.0.5用SpringMVC我定義的方法在我的控制器是這樣的:和用SpringMVC特點@ModelAttribute

@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對象?

+1

你有沒有嘗試添加'@SessionAttributes(「沃」 )'作爲控制器類的註釋? – Pat

+0

感謝您的回覆。這可能會給我一些我可以使用的東西,但我試圖在更多的架構層面上弄清楚發生了什麼。它或者是春天的一個特點,一個錯誤,或者也許是我自己的無知? – kasdega

+0

你有@RequestMapping類或saveFoo方法的批註嗎? –

回答

0

我已經嘗試過許多不同的事情,包括對有效和ModelAttribute註釋重新排序,它似乎沒有區別。

在閱讀Pat在評論中提出的文檔時,它確實指向存儲VO的特殊上下文。無論如何,如果你嘗試類似的東西,我建議你用不同的方式去做,也許建立一個全新的VO並把它傳回到視圖,這就是我所做的。

1

wierd。同樣的事情對我有用。我看到的唯一區別是有效和ModelAttribute的順序 您可以嘗試顛倒Valid和ModelAttribute的順序嗎?

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

順便說一句,你正在使用哪種版本的彈簧?

+0

優秀的問題,我應該包括...我使用彈簧3.0.5 – kasdega

+0

感謝您的迴應。我會給這個鏡頭看看會發生什麼。順便說一句,有什麼最佳做法或指導線,以什麼順序@? – kasdega

+0

這並沒有改變我的任何東西。 – kasdega

0

嘗試命名您的對象「descriptionBuilderVO」,如下所示:

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

我知道它不應該是這樣的,但我發現問題時,該對象的名稱是不是類不同名稱。

注意,你還必須在你的JSP來改變對象的名稱:

<form:form commandName="descriptionBuilderVO" 

...等...