2012-06-02 8 views
15

Javascriptをマップするためにジャクソンを使用する際に、JSON配列のハッシュ(タグ)が表示されています。ここ オブジェクトのJSON配列を@RequestBodyリストにマップ<T>ジャックソンを使用


はコントローラ@RequestBodyによって受信されたデータである(これは正しいのJSON requestheaderと送られる):

@RequestMapping(value = "purchases/{purchaseId}/tags", method = RequestMethod.POST, params = "manyTags") 
@ResponseStatus(HttpStatus.CREATED) 
public void createAll(@PathVariable("purchaseId") final Long purchaseId, @RequestBody final List<Tag> entities) 
{ 
     Purchase purchase = purchaseService.getById(purchaseId); 

     Set<Tag> tags = purchase.getTags(); 
     purchaseService.updatePurchase(purchase); 
    } 

Iデバッグ:ここ

[{name=tag1}, {name=tag2}, {name=tag3}] 


コントローラであります私が期待する 'Tag'型のオブジェクトのリストではなく、汎用オブジェクトのArrayListとして表示される 'entities'値を表示します。

どのようにすれば、渡されたオブジェクトの配列を 'Tag'型のオブジェクトのリストにマップできますか?

おかげ

+0

は、あなたがこのようにそれを試してみましたか? –

+0

私はそのショーンを試していませんでしたが、私は「代わりに@RequestBodyの配列。 http://stackoverflow.com/questions/4441557/rest-with-spring-and-jackson-full-data-bindingを参照してください。 –

答えて

39

春が何らかの理由ではなく、型消去バージョンの完全な型情報を渡していないよう宣言はList<?> tagのようなものだったかのように、聞こえます。私は完全に(Spring統合チームから何かを必要とするかもしれない)これを解決するために何ができるかわからないが、1回避策は次のように独自のタイプを定義することです:

static class TagList extends ArrayList<Tag> { } 

と代わりに使用。これにより、スーパータイプの宣言による汎用パラメータの保持が維持され、SpringがTagList.classに相当するものを渡しても、JacksonはTagパラメータを把握できます。次のようにこれを行うには

+0

乾杯StaxMan ....私は、次のリンクに出くわしました。ここにあなたのもの。 http://stackoverflow.com/questions/4441557/rest-with-spring-and-jackson-full-data-binding –

+0

ありがとうStaxMan。私は同じ問題に直面していた。あなたの答えは私を助けました。 –

+0

これはとてもシンプルで実用的なので、私はこれをAndroidアプリで使用しています。ありがとう – Gino

16

もう一つの方法は、むしろリストよりも配列を得ることである:

@RequestBody Tag[] entities 
+0

はいはいトーマスはタグのリストを取得したかったが、これが機能しないことを見て、むしろ配列を取得することを提案しました。私はこの同じ問題を抱えて苦労しましたが、現時点では、リスト内のオブジェクト、汎用オブジェクトは作成されませんが、これは将来修正されるかもしれませんが、わからないのでリストを取得する代わりにRequestBodyを介して、送信側で変更することなく、その特定のオブジェクトの配列を取得する必要があります。 – liloboy

0

ジャクソンは、カスタムオブジェクトのパラメータのないデフォルトコンストラクタが必要ですので、あなたは、単に追加する必要がありますデフォルトのコンストラクタをTagクラスに追加します。あなたのケースでは

単にあなたTagクラスに追加:

public Tag(){} 
関連する問題