20

Jacksonを使用してJavascriptで投稿されたハッシュのJSON配列(タグ)をマッピングする際に問題が発生しました。


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

[{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);
    }

'entities'値をデバッグして表示すると、予想されるようにタイプ'Tag'のオブジェクトのリストとしてではなく、ジェネリックオブジェクトのArrayListとして表示されます。

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

ありがとう

4

3 に答える 3

41

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

static class TagList extends ArrayList<Tag> { }

代わりにそれを使用してください。これにより、スーパータイプ宣言による一般的なパラメーター化が保持されるため、Springが同等のもののみを渡した場合でもTagList.class、Jacksonはパラメーターを把握できTagます。

于 2012-06-02T17:20:01.683 に答える
20

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

@RequestBody Tag[] entities
于 2014-06-03T16:17:25.540 に答える
1

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

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

public Tag(){}
于 2017-04-03T17:57:29.023 に答える