1

次のシナリオを処理するためのベスト プラクティスに関するアドバイスを探しています。

JSON 要求を受け入れる Java ベースの Web API がある場合、JSON オブジェクトを Java にマップする必要があります。この質問は、Java オブジェクトがパラメトリック型である場合に関するものです。私の特定のケースでは、Spring と MappingJacksonHttpMessageConverter を使用してマッピングを行っています。

REST サービスの例

@RequestMapping(method = RequestMethod.POST) 
public void updateContainer(@RequestBody Container<?> container) {
    realService.updateContainer(container);
}

パラメトリック タイプの例

public class Container<T extends ContainerItem> {
      private T containerItem;
      ...
}

このメソッドを呼び出すと、実行時に Container のタイプが消去され、Jackson が containerItem をマップする方法がわからないため (どのタイプにマップするかわからないため)、400 エラー (不正な要求) が発生します。

非常に基本的なソリューションが実装されています。このソリューションでは、containerItem の Java クラス名を指定する JSON データにフィールドを追加し、このクラス名を使用して、Jackson ObjectMapper が使用できるパラメトリック JavaType を構築するカスタム HttpMessageConverter を追加しました。マッピングですが、これを処理するより良い方法があるかどうか疑問に思っていますか?

4

1 に答える 1

4

解決策は、パラメトリック型を宣言し、これを@RequestBodyこの方法のターゲットとして使用することです。

public class MyCustomTypeContainer extends Container<SubContainerItem>  {
..
}

public void updateContainer(@RequestBody MyCustomTypeContainer container) {
    realService.updateContainer(container);
}

はパラメトリック型でなければならないことに注意してくださいMyCustomTypeContainer(ジェネリック型は完全に実現されています)。これは、すべての containerItem タイプに対してサブタイプを作成する必要がある可能性があることを意味します。

同じ行に沿った別の質問については、こちらを参照してください。

于 2013-09-30T01:00:54.207 に答える