我正在尝试在简单的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”)。
那么,当我向模型添加数据时,可能导致验证消息消失的原因是什么?我是否可以在保留验证消息的同时重定向到原始表单?
谢谢,
罗素
答案 0 :(得分:0)
验证错误附加到无效的对象。如果用新的对象替换无效的对象:
model.addAttribute(
的 new
强> DomainObject());
然后错误消息未附加到此对象。