2016-07-20 2 views
2

現在のJava WebアプリケーションでJSONプラグイン(https://struts.apache.org/docs/json-plugin.html)を設定する必要があります。私がしたこと:プロパティsetData [JSON + Struts2 plugin]の互換性のないタイプ

1)pom.xmlに追加され、プラグインのすべての依存関係が追加されました。

<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-json-plugin</artifactId> 
    <version>2.3.24.1</version> 
</dependency> 

2)は、自分の行動にJSON

<action name="myMainAction" 
    class="org.com.action.myMainAction"> 
     <interceptor-ref name="json"> 
      <param name="enableSMD">true</param> 
     </interceptor-ref> 
     <result type="json">      
     </result>   
    <param name="requiredAuthorities">F_ADD</param> 
</action> 

4)作成したモデルの迎撃と結果タイプを追加しましたjson-default

<package name="my-test-package" extends="xxx, json-default" 
    namespace="/my-test-package"> 

3)でstruts.xmlでパッケージを拡張しますクラスMarriageにはセッター/ゲッターしかありません。

5)JSONオブジェクトを作成し、次のコード

private List <Marriage> data; 

public List<Marriage> getData() { 
    return data; 
} 
public void setData(List<Marriage> data) { 
    System.out.println("Inside the setter "); 
    this.data = data; 
} 


@Override 
public String execute() throws Exception { 

    System.out.println(data.get(0).getLastNameHe()); 

    return SUCCESS; 
} 

6)でmyMainActionという名前のActionクラスを作成し、サーバにajaxを経由して、それを通過しました。私は、Google Chrome Consoleを介して、データを送信し、JSONオブジェクトを解析し、すべてのデータがそこにあることがわかります。しかし、それは私のEclipseで例外をスローしてもクロームコンソールのん:

Exception occurred during processing request: Incompatible types for property setData (CommonsLogger.java [qtp1144623021-22]) org.apache.struts2.json.JSONException: Incompatible types for property setData

あなたはそれはほとんど私はそれに取り組んでいます二日目だが、それにはない、いくつかの正しい方向に私を指すしてもらえ働き始めているようだ。

EDIT1: Java側に送信されているデータで、Chromeのコンソールから見ることができます。

{"data":{"recordId":"123","registrationDate":"20-07-2016","hisId":"","herId":"","lastNameHe":"Asd","firstNameHe":"Asd","middleNameHe":"Asd","workPlaceHe":"","educationHe"}} 

それはJSON.stringifyが-edされた後にこれがオブジェクトです。 ご覧のとおり、ルートにはdataという変数があり、残りのデータはすべてその下にあります。私の論理によると、私のJavaクラスのデータのsetterを見つけて、そのクラスのセッター/ゲッタを呼び出しなければなりません。 P.Sクラス名などの名前を変更したため、命名規則に関する心配はありません)私は自分のプロダクションコードに正しいことを持っています。

EDIT2:私のミスの@AleksandrMに指摘して

感謝。私はそれがstringdateにし、それができるを設定しようと理解したよう

private Date registrationDate; 
    public Date getRegistrationDate() { 
    return registrationDate; 
} 

public void setRegistrationDate(Date registrationDate) { 
    this.registrationDate = registrationDate; 

Unparseable date: "20-07-2016" (CommonsLogger.java [qtp212900572-17]) java.text.ParseException: Unparseable date: "20-07-2016"

この部分のjson変数はregistrationDateで、JAVAでの実装:今、それは非常に奇妙なエラーがスローされますそれはしない。なぜjson-pluginで変換できないのですか?オプション/設定に何かを書く必要がありますか?

+0

jsonインターセプタの代わりにdefaultStackとjsonインターセプタを使用すると機能しますか?結婚には既定の無argsコンストラクタ(またはコンストラクタなし)がありますか? P.S:alervcase文字で始まるJavaクラスは良くない –

+0

'defaultStack' +' json'インターセプタを使う必要があります。送信しているデータを表示する。 –

+0

@AndreaLigios、私はそれがdefaultStackの問題かstrutsのインターセプタの位置だとは思っていません。私のMarraigeクラスにはコンストラクタがありません。そのMarraigeクラスは、DBテーブルなどを作成するために、休止状態に関連しています。そのクラスの目的は、それを記述する純粋なモデルに過ぎません。 – Daler

答えて

2

あなたはJavaコードでList<Marriage> dataを期待していますが、JSONオブジェクトは配列を保持していません。 JavaコードをMarriage dataに変更するか、JSONにオブジェクトの配列を配置してください。

アクションには、json以外のインターセプタを定義することもできます。 カスタムインターセプタスタックを作成し、アクション設定で参照します。日付文字列の場合

<interceptor-stack name="json-stack"> 
    <interceptor-ref name="json" /> 
    <interceptor-ref name="defaultStack" /> 
</interceptor-stack> 

yyyy-MM-dd'T'HH:mm:ssです)Dateオブジェクト変換用のデフォルトフォーマットまたはカスタムStruts type converterを作成します。 またはセッターに@JSON(format = "dd.MM.yyyy")を使用してください。

this follow up questionを参照してください。

+0

完全性のために、彼は2.3.24.1を使用しているが、デフォルトフォーマット(日付のみのRFC3339)[2.3.28から利用可能](https://issues.apache.org/jira/browse/WW-4551)は強制されているコンバータのために行く –

+0

@AndreaLigios \t jsonと型変換についての部分のようですが間違っています。それを変えるつもり。 –

+0

@AndreaLigios、私は既定のフォーマット日付について読んでいますが、私はパッチを認識していますが、私は大きなフレームワークを使用していますので、アップグレードできません。別のフレームワークの問題に対処する – Daler

関連する問題