使用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。
BTW我的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对象?
答案 0 :(得分:1)
奇怪。同样的事情对我有用。我看到的唯一区别是Valid和ModelAttribute的顺序 你能尝试颠倒Valid和ModelAttribute的顺序吗?
public ModelAndView saveFoo(...
@Valid @ModelAttribute("vo") DescriptionBuilderVO vo, BindingResult result) {
}
BTW,您使用的是哪个版本的弹簧?
答案 1 :(得分:0)
我尝试了很多不同的东西,包括重新排序Valid和ModelAttribute注释,但它似乎没有什么区别。
在阅读评论中Pat建议的文档时,它确实涉及存储VO的特殊上下文。无论如何,如果你正在尝试类似于此的任何东西,我建议你以不同的方式进行,或许建立一个全新的VO并将其传回视图,这就是我所做的。
答案 2 :(得分:0)
尝试命名对象“descriptionBuilderVO”,如下所示:
@Valid @ModelAttribute("descriptionBuilderVO") DescriptionBuilderVO descriptionBuilderVO,
BindingResult result)
我知道不应该这样,但是当对象的名称与类名不同时,我发现了问题。
请注意,您还必须更改jsp中对象的名称:
<form:form commandName="descriptionBuilderVO"
...等...