2017-01-16 10 views
0

数日から問題があります。私はそれが非常に基本的だと確信していますが、私は解決策を見つけることができません。Springで角型データを復元する

私は、Angular形式で送信されたデータをSpringでJavaメソッドに復元しようとしています。

App.js

myController.prototype = { 
 

 
    processForm : function processForm() { 
 
     alert('foo!'); 
 
    }, 
 

 
    retrieveUrl : function retrieveUrl() { 
 
     this.url.$ready = false; 
 
     return this.http 
 
      .post("/myURL", {data : this.formData}) 
 
      .then(function(response) { 
 
       // do something 
 
      }.bind(this), function(error) { 
 
       // do something else 
 
      }.bind(this)); 
 
    } 
 
};

FORMDATAの値::私のコードは次のようである

{data : 
 
    {"object1": 
 
     {"prop1":"q", 
 
     "prop2":"w"}, 
 
    "object2": 
 
     {"prop3":"e", 
 
     "prop4":"r"} 
 
    } 
 
}

そして、私のJavaコード:

@RequestMapping("/myURL") 
 
    public void myController(@RequestBody Form form) { 
 
     System.out.println(form); 
 
    }
私も空のコンストラクタとcorespondingゲッターとセッターとの3つの豆、フォーム、オブジェクト1とObject2に、それぞれを持っています。

今日、myControllerに入力しましたが、オブジェクトフォームはnullではなく、2つのフィールド(object1とobject2)がnullです。だから、私は、Springがデータフォームをこれらの2つのオブジェクトに変換する必要があることを理解していないと思います。

EDIT:

トーマス・ピエール>ここに私のフォームBeanのコードがある

public class Form { 
 

 
    public Object1 object1; 
 

 
    public Object2 object2; 
 

 
    public Form(){} 
 

 
    public Object1 getObject1() { 
 
     return object1; 
 
    } 
 

 
    public void setObject1(Object1 object1) { 
 
     this.object1 = object1; 
 
    } 
 

 
    public Object2 getObject2() { 
 
     return object2; 
 
    } 
 

 
    public void setObject2(Object2 object2) { 
 
     this.object2 = object2; 
 
    } 
 

 
    @Override 
 
    public String toString(){ 
 
     return "BankForm [debitor = " + debtor +", bank = " + bank + "]"; 
 
    } 
 
}
更新: "パブリック最終クラス" - > "publicクラス"

缶私たちはSpringアノテーションを使って自動的に逆シリアル化を行いませんか?

EDIT 2:ここでは は私のbuild.gradleファイルです:

buildscript { 
 
\t ext { 
 
\t \t springBootVersion = '2.0.0.BUILD-SNAPSHOT' 
 
\t } 
 
\t repositories { 
 
\t \t mavenCentral() 
 
\t \t maven { url "https://repo.spring.io/snapshot" } 
 
\t \t maven { url "https://repo.spring.io/milestone" } 
 
\t } 
 
\t dependencies { 
 
\t \t classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
 
\t } 
 
} 
 

 
apply plugin: 'java' 
 
apply plugin: 'idea' 
 
apply plugin: 'org.springframework.boot' 
 
// apply plugin: 'war' 
 

 
jar { 
 
\t baseName = 'my-project' 
 
\t version = '0.0.1-SNAPSHOT' 
 
} 
 

 
sourceCompatibility = 1.8 
 
targetCompatibility = 1.8 
 

 
repositories { 
 
\t mavenCentral() 
 
\t maven { url "https://repo.spring.io/snapshot" } 
 
\t maven { url "https://repo.spring.io/milestone" } 
 
} 
 

 
configurations { 
 
\t providedRuntime 
 
} 
 

 
bootRun { 
 
    // static classpath resources (i.e. in src/main/resources by default) are 
 
    // reloadable in the live application 
 
\t addResources = true 
 
} 
 

 
dependencies { 
 
    compile group: 'com.google.code.gson', name: 'gson', version: '1.7.2' 
 
    compile("org.springframework.boot:spring-boot-starter-web") { 
 
     exclude module: "spring-boot-starter-tomcat" 
 
    } 
 
    compile("org.springframework.boot:spring-boot-starter-jetty") 
 
    providedRuntime("org.springframework.boot:spring-boot-starter-jetty") 
 

 

 
\t compileOnly('org.projectlombok:lombok') 
 

 
    testCompile("junit:junit") 
 

 
\t testCompile('org.springframework.boot:spring-boot-starter-test') 
 

 
}

Object1.java:

public class Object1 { 
 

 
    public String prop1; 
 

 
    public String prop2; 
 

 
    public Object1(){} 
 
    
 
    public void setProp1(String prop1) { 
 
     this.prop1 = prop1; 
 
    } 
 

 
    public String getProp1() { 
 
     return prop1; 
 
    } 
 

 
    public void setProp2(String prop2) { 
 
     this.prop2 = prop2; 
 
    } 
 

 
    public String getProp2() { 
 
     return prop2; 
 
    } 
 
}

Object2.javaはまったく同じです。番号を変更するだけです。フォームの名前、Object1とObject2のフィールド名、およびAngularで返されるformDataの名前の間にタイプミスや差異がないことを2回確認しました。

JavaでリカバリするJSONを書き直して間違えました。Object1とObject2を含む「データ」という種類の「スーパーオブジェクト」があります。これは問題ではありませんか?

+0

は、JSON(メソッドからインスタンスを戻すと方法@ResponseBodyを追加)として人口フォームインスタンスを返すコントローラメソッドを追加します。投稿しているJSONは、この呼び出しによって返されるものと同じ形式である必要があります。 –

答えて

1

あなたのフォームクラスは最終的です。私はあなたのジャクソンを使用してセッターを使用してフォームを逆シリアル化すると思います。最終的にジャクソンはセッターを使ってオブジェクト1とオブジェクト2を設定することはできません。そして、彼らはnullで

EDIT:

.post("/myURL", {data : this.formData})

付::

.post("/myURL", this.formData) 
あなたの角度アプリで

更新: は、あなたの豆の決勝

EDIT 2を設定しないでください

この条件を満たすhodsは送信するオブジェクトを待機しています。 {data:this.formData}を置くことによって、 'data'属性を持つスーパーオブジェクトを追加します。

+0

申し訳ありませんが、どちらもうまくいきません...私の豆は現在最終段階にありませんが、結果は同じです。 – Marine

+0

どのバージョンのスプリングを使用しますか?あなたはポストにpom.xmとあなたのクラスを追加できますか? –

+0

バージョン2.0.0ではSpringBootを使用します。私はgradを使っているので、pom.xmlはありません。しかし、私は確かに自分のbuild.gradleを投稿することができます。 – Marine

0

トーマスが正しいです。

もう1つの方法は、Gsonのシリアル化を使用する方法です。

実装において

@RequestBody文字列

私はちょうどobj = new Gson().fromJson(string, type);

+0

どちらも動作しません。 Angular、Gson、Springの実例がありますか? – Marine

+0

まだ同じ結果ですか?フォームクラスが作成されましたが、null Obj1とObj2がありますか? –

+0

はい、全く同じです。 – Marine

関連する問題