0

我试图让基于 Spring 注释的验证在一个简单的 web 应用程序中工作。我正在使用 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" 的链接)。

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

谢谢,

罗素

4

1 回答 1

0

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

model.addAttribute(newDomainObject());

那么错误消息不会附加到该对象。

于 2011-04-13T05:37:50.377 回答