0

単純な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"を変更するリンク)。

では、モデルにデータを追加すると、検証メッセージが消える原因は何でしょうか。また、検証メッセージを保持したまま、元のフォームにリダイレクトすることはできますか?

ありがとう、

ラッセル

4

1 に答える 1

0

検証エラーは、無効なオブジェクトに付加されます。無効になっているオブジェクトを新しいオブジェクトに置き換える場合:

model.addAttribute(newDomainObject());

その場合、エラーメッセージはこのオブジェクトに添付されません。

于 2011-04-13T05:37:50.377 に答える