当属性添加到模型时,Spring MVC 3验证将不起作用

时间:2011-04-13 00:31:58

标签: validation spring-mvc annotations spring-3

我正在尝试在简单的Web应用程序中使用基于Spring注释的验证。我正在使用Spring 3.0.5,Tiles 2.2.2。在一个特定情况下,我可以在字段旁边显示验证错误,但是只要我将任何对象添加到模型中它就会停止工作。理想情况下,在POST之后,我想重定向到包含验证错误的表单的GET。这是设置:

我有一个简单的域对象。

public class DomainObject {

    @NotEmpty
    private String name;    
    private Date created;   
    private Date lastModified;
...
}

我有一个带有GET方法的控制器,它将所有现有的DomainObjects添加到模型中,并返回一个显示它们的视图,并包含一个非常简单的表单来创建它们。它还有一个用于创建新DomainObject的POST方法。

@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>

使用此设置,如果我将名称字段留空,则会拾取验证错误并正确显示在该字段的右侧。但是,该表始终为空,因为没有对象添加到模型中。如果我通过取消注释行

将对象添加到模型中
//model.addAttribute("objects", domainObjectService.getAll());
//model.addAttribute(new DomainObject());

表格已填充但不再出现验证错误。我无法解决这个问题。

作为另一个不需要的副作用,我在视图中的任何相对链接现在都不再起作用(例如,更改语言环境的链接href =“?lang = de”)。

那么,当我向模型添加数据时,可能导致验证消息消失的原因是什么?我是否可以在保留验证消息的同时重定向到原始表单?

谢谢,

罗素

1 个答案:

答案 0 :(得分:0)

验证错误附加到无效的对象。如果用新的对象替换无效的对象:

model.addAttribute( new DomainObject());

然后错误消息未附加到此对象。