2011-11-08 26 views
2

私はStruts2 ActionクラスからJSON応答を得るのに苦労しています。私は自分のプロジェクトで以下の設定をしています。私のモジュールレベルのアクション定義でStruts2はAJAX呼び出しで空のJSONを返します

が、設定は次のようになります。私のStruts.xmlに

<package name="customer" namespace="/" extends="struts-default,json-default"> 
    <action name="getCustomer" method="getCustomerBusiness" class="CustomerAction"> 
     <result type="json"/> 
    </action> 
</package> 

私は私のアクションクラスで

<result-types> 
    <result-type name="json" class="org.apache.struts2.json.JSONResult"/> 
</result-types> 

<interceptors> 
    <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/> 
</interceptors> 

を持っている:

public class CustomerAction extends ActionSupport implements ServletRequestAware, 
     ServletResponseAware, ModelDriven { 
    private List<CustomerBean> cpbeanList; 

    public List<CustomerBean> getCpbeanList() { 
     return cpbeanList; 
    } 

    public void setCpbeanList(List<CustomerBean> cpbeanList) { 
     this.cpbeanList = cpbeanList; 
    } 

    public String getCustomerBusiness() { 
     cpbeanList = new ArrayList<CustomerPortfolioBean>(); 
     // jsonData = new LinkedHashMap<String, Object>(); 
     CustomerBean cb1 = new CustomerPortfolioBean(); 
     cb1.setBusinessNm("IBM"); 
     cb1.setBusinessAddr("475 Anton Blvd"); 
     cb1.setBusinessPh("00000000"); 
     cb1.setBusinessCity("Costamesa"); 
     cb1.setBusinessStateCd("CA"); 
     c1.setBusinessZip("92704"); 

     similarly cb2, cb3, cb4. 

     cpbeanList.add(cb1); 
     cpbeanList.add(cb2); 
     cpbeanList.add(cb3); 
     cpbeanList.add(cb4); 
     return SUCCESS; 
    } 

} 

JSONリクエストhttp://localhost:8080/customer/getCustomerは私に空の配列を返します{}ファイヤーバグで...私は見ることができます。

また、JQueryでデータテーブルの入力として試しています。このため行がない。

いずれかの助けがありがとうございます。

+0

私は混乱しています。あなたの 'getModel()'はどこですか?なぜ "json"結果型を再定義するのですか? 'getCpbeanList()'が何も返さないのはなぜですか?アクション宣言のパッケージ名はどこですか?私はそれがデフォルトのパッケージにないことを願っています。あなたは春を使っていますか? –

+0

はい私はSpring - Strutsを使用しています。 –

+0

私のパブリックリスト getCpbeanList(){ \t \t return cpbeanList; \t} –

答えて

2

アクションのスーパークラスはModelDrivenを実装しているため、サブクラスも実装されています。 JSONとしてシリアライズされるモデルです。モデルが空の場合、何もシリアル化されないので、何も戻ってこない。

サブクラスはgetModel()をオーバーライドし、シリアル化するデータをJSONに戻す必要があります。

+0

私は同じ問題を抱えていますが、それを動作させるためにはどのような変更が必要ですか? – piechuckerr

1

ModelDrivenインターセプタがValueStack

  • の上にモデルをプッシュ

    • のでJSON結果

    とその

      を知っ全体のアクションをシリアライズ
    • JSON結果rootパラメータが

    私たちが作ることができるOGNLを受け入れ

  • 全体のアクションの属性に、代わりにその要素の一つにJSONシリアライズを制限するように構成することができますrootパラメータを持っています,
    は、より制限的ではなく(モデルの視点から見て)、より限定的ではないことを指示することができるという前提があります。

    あなたはそれをシリアル化するために実際に可能かどう発見する

    <result type="json"> 
        <param name="root"> 
         #action 
        </param> 
    </result> 
    

    [1]がアクションであることを保証するものではありませんので)

    <result type="json"> 
        <param name="root"> 
         [1] 
        </param> 
    </result> 
    

    またはより良いような何かをしようとすることができValueStackの上にモデルを維持しながら、アクション全体。

  • +0

    複数のfieldErrorとactionErrorにはどうすればアクセスできますか?今は fieldErrorsを使用しています – piechuckerr

    +0

    ちょうどメモ: '[1]'はアクションを指示しない可能性があるため潜在的に危険です。 –

    +0

    私は2つのルートを持つことができます。 fieldErrorsと actionErrors – piechuckerr

    関連する問題