0

私はこのクラスを持っています:

PreApprovalRequest クラスにはheadings、コントローラーに自動的に入力されるプロパティがあります (ページ下部のコントローラーのコードを参照)。

public class PreApprovalRequest {
    private Long id;
    private String Description;
    private Collection<Headings> headings; //this property!
}

そしてコントローラー:

@Controller
@SessionAttributes({"preApprovalRequest", "productRecommendations"})
public class RequestController {

    @RequestMapping(value = "/submit",  method = RequestMethod.POST)
    public String submitResults(@ModelAttribute(value = "preApprovalRequest") @Valid PreApprovalRequest preApprovalRequest, BindingResult errors) {
        //HERE: It looks like if I have some headings in the preApprovalRequest object already, the call of this method will not delete those, but will append to the existing list.
        //save object in DB.
        return "dashboard";
    }
}

Springにコレクションオブジェクトを追加するのではなく、コレクションオブジェクトを置き換える方法はありますか?

4

3 に答える 3

0

初めてフォームを送信した場合でも発生しますか?そうでない場合は、コントローラーのすべてのアクションが完了した後で、キャッシュをクリーンアップしてみてください。

メソッドにSessionStatusを追加し、「setComplete()」を呼び出して属性をクリーンアップします。したがって、2回目にプロセスを開始すると、キャッシュは空になり、新しいpreApprovalRequestを使用する必要があります。

@RequestMapping(value = "/submit",  method = RequestMethod.POST)
public String submitResults(@ModelAttribute(value = "preApprovalRequest") @Valid PreApprovalRequest preApprovalRequest, BindingResult errors, SessionStatus status) {
    /HERE: It looks like if I have some headings in the preApprovalRequest object already, the call of this method will not delete those, but will append to the existing list.
    //save object in DB.

    status.setComplete();
    return "dashboard";
}
于 2013-01-25T10:21:53.387 に答える
0

探しているものがリストの動的な縮小/拡大の種類である場合、コレクションは遅延でなければなりません.Apacheコモンズコレクションはそれを行う遅延リストクラスを提供します.Apacheコモンズコレクションはhttp://commons.apacheから取得できます.org/コレクション/

したがって、コントローラーモデルは次のように書き直すことができます。

public class PreApprovalRequest {
    private Long id;
    private String Description;
    private List headings;

    public PreApprovalRequest()
    {
        headings=LazyList.decorate(
           new ArrayList(),
           FactoryUtils.instantiateFactory(Header.class));
    }

}

データをリストにバインドする背後にあるアイデアは、html 要素の name 属性でリスト項目のインデックスを追跡することです。

<c:forEach item="${modelAttr.list}" varStatus="listItem">

<form:input type="text" path="list[${listItem.index}]" />

</c:forEach>
于 2013-01-25T11:19:09.543 に答える
0

あなたの質問をどのように理解したかというと、headingsコレクションを新しいコレクションに置き換えることはできないということですHeadings。以下の方法でできませんか?

preApprovalRequest.setHeadings(new ArrayList<Headings>());
preApprovalRequest.getHeadings().add(heading1);
于 2013-01-25T05:01:34.663 に答える