ジャクソンを使用して、ハッシュ(タグ)の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として表示されます。
渡されたオブジェクトの配列を「タグ」タイプのオブジェクトのリストにマップするには、どうすればジャクソンを取得できますか?
ありがとう
Springは何らかの理由で完全な型情報を渡すのではなく、宣言がList<?> tag
。これを完全に解決するために何ができるかわかりません(Spring統合チームから何かが必要になるかもしれません)が、1つの回避策は、次のような独自のタイプを定義することです:
static class TagList extends ArrayList<Tag> { }
代わりにそれを使用します。これは、SpringがTagList.class
、ジャクソンはTag
パラメーターを把握できます。
これを行う別の方法は、次のように、リストではなく配列を取得することです。
@RequestBody Tag[] entities
Jacksonは、カスタムオブジェクトにパラメーターのないデフォルトコンストラクターを必要とするため、Tag
クラスにデフォルトコンストラクターを追加するだけです。
あなたの場合、単にTag
クラスに追加してください:
public Tag(){}