web-dev-qa-db-ja.com

jacksonを使用してオブジェクトのJSON配列を@RequestBody List <T>にマップします

ジャクソンを使用して、ハッシュ(タグ)のJavascript投稿JSON配列をマップする際に問題が発生しています。


コントローラー@RequestBodyが受信したデータは次のとおりです(正しいJSON要求ヘッダーで送信されます)。

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


コントローラーは次のとおりです。

@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);
    }

「エンティティ」の値をデバッグして表示すると、予想される「タグ」タイプのオブジェクトのリストとしてではなく、汎用オブジェクトのArrayListとして表示されます。

渡されたオブジェクトの配列を「タグ」タイプのオブジェクトのリストにマップするには、どうすればジャクソンを取得できますか?

ありがとう

18
Thomas Buckley

Springは何らかの理由で完全な型情報を渡すのではなく、宣言がList<?> tag。これを完全に解決するために何ができるかわかりません(Spring統合チームから何かが必要になるかもしれません)が、1つの回避策は、次のような独自のタイプを定義することです:

static class TagList extends ArrayList<Tag> { }

代わりにそれを使用します。これは、SpringがTagList.class、ジャクソンはTagパラメーターを把握できます。

39
StaxMan

これを行う別の方法は、次のように、リストではなく配列を取得することです。

@RequestBody Tag[] entities
17
user636549

Jacksonは、カスタムオブジェクトにパラメーターのないデフォルトコンストラクターを必要とするため、Tagクラスにデフォルトコンストラクターを追加するだけです。

あなたの場合、単にTagクラスに追加してください:

public Tag(){}
0
user2812481