2

私は他の多くのネストされたオブジェクトとオブジェクトのリストを持つ Java オブジェクトを持っています。クライアントからリクエストが届くと、オブジェクトがいくつかのレベルにしか設定されていないことがわかります。これを Struts 2 に設定する構成はありますか? これが私の例です。

class MyActionClass extends ActionSupport {
    private Abc abc;
    public Abc getAbc() {
        return abc;
    }
    public void setAbc(Abc abc) {
        this.abc = abc;
    }
    public String populate() {
        MyService myService = new MyService();
        abc = myService.getMyAbc();
        return SUCCESS;
    }
    public String update() {
        MyService myService = new MyService();
        myService.updateAbc(abc);
        return SUCCESS;
    }
}

class Abc {
    private List<Def> defList;
    private Ghi ghi;
    public void setDefList(List<Def> defList) {
        this.defList = defList;
    }
    public List<Def> getDefList(){
        return defList;
    }
    public void setGhi(Ghi ghi) {
        this.ghi = ghi;
    }
    public Ghi getGhi() {
        return ghi;
    }
}

class Def {
    private String name;
    private long id;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
}

class Ghi {
    private List<Def> defList;
    private String ghiName;

    public void setDefList(List<Def> defList) {
        this.defList = defList;
    }
    public List<Def> getDefList() {
        return defList;
    }
    public void setGhiName(String ghiName) {
        this.ghiName = ghiName;
    }
    public String getGhiName() {
        return ghiName;
    }
}

メソッドを呼び出してpopulatejspに送信すると、すべての要素で反復がうまくいきます。しかし、更新しようとすると、つまりフォームが送信されると、update()メソッドが呼び出されますが、インスタンス変数 abc は完全には取り込まれません。

渡された URL を確認しましたが、すべて問題ないようです。何が起こるか教えてください。URLは次のようになります(ここでは理解しやすいように改行で分割しています)、

&abc.defList[0].name=alex
&abc.defList[0].id=1
&abc.defList[1].name=bobby
&abc.defList[1].id=2
&abc.ghi.ghiName=GHINAME
&abc.ghi.defList[0].name=Jack
&abc.ghi.defList[0].id=1
&abc.ghi.defList[1].name=Jill
&abc.ghi.defList[1].id=2

この場合、defListinsideabcghi.ghiNameinabcは問題なく読み込まれます。しかし、defListabc.ghiは移入されていません。これは Struts 2 の一般的な動作ですか? これをオーバーライドできる手段はありますか?

4

1 に答える 1

1

問題を解決しました。ストラット2ロック。私が入手したコードはバグ修正のためのものだったので、その中に何が入っているのかわからず、一度もチェックしませんでした。

犯人はtoString()オーバーライドされたメソッドでした。これはマップ上で null をチェックせず、その上でentrySet()メソッドを呼び出しました。これにより例外が生成され、Struts がオブジェクトにデータを入力できなくなりました。

理解を深めるために、Struts はデータを入力するときtoString()に何らかの目的でメソッドを呼び出します。将来誰かがこれに直面した場合は、オーバーライドtoString()したかどうか、およびすべてがその中に設定されているかどうかを忘れずに確認してください。

于 2011-08-30T13:31:32.697 に答える