単純なWebアプリでSpringアノテーションベースの検証を機能させようとしています。Spring 3.0.5、Tiles2.2.2を使用しています。ある特定のケースでは、フィールドの横に検証エラーが表示されることがありますが、モデルにオブジェクトを追加するとすぐに機能しなくなります。理想的には、POSTの後で、検証エラーが含まれているフォームのGETにリダイレクトしたいと思います。これはセットアップです:
単純なドメインオブジェクトがあります。
public class DomainObject {
@NotEmpty
private String name;
private Date created;
private Date lastModified;
...
}
既存のすべてのDomainObjectをモデルに追加し、それらを表示するビューを返すGETメソッドを備えたコントローラーがあり、それらを作成するための非常に単純なフォームが含まれています。また、新しい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());
テーブルにデータが入力されますが、検証エラーは表示されなくなります。私はこれを解決することはできません。
もう1つの望ましくない副作用として、ビューにある相対リンクが機能しなくなりました(たとえば、ロケールhref = "?lang = de"を変更するリンク)。
では、モデルにデータを追加すると、検証メッセージが消える原因は何でしょうか。また、検証メッセージを保持したまま、元のフォームにリダイレクトすることはできますか?
ありがとう、
ラッセル