0

オブジェクトの JSON 配列を返す API を呼び出すために Restlet を使用しています。単一のオブジェクトをプルバックするために同様の呼び出しを行うと、すべてがカスタム クラスに正しくマップされますが、配列をプルバックすると、オブジェクトはこのカスタム オブジェクトではなく LinkedHashMap としてマップされます。配列を正しく逆シリアル化する方法を定義する必要があるだけだと確信していますが、その方法を正確に理解していません。

@Get("json")
public Trait getTrait();

@Get("json")
public HashSet<Trait> getTraits();

前者はうまくいきますが、後者はうまくいきません。最終的に HashSet を反復しようとすると、次のエラーが発生する可能性があります: java.util.LinkedHashMap を com.test.traits.Trait にキャストできません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

これは一般に、型がHashSetジェネリック型 ( HashSet<Trait>) ではなくクラス ( など) として渡されるためです。もしそうなら、これは に相当しHashSet<Object>、Jackson はコンテンツを利用可能な最も単純な Object タイプにバインドする以外に選択肢はありませんjava.util.Collection

何らかの理由で Restlet がジェネリック型情報を正しく渡していないようです。

これには次の回避策があります。

  • Lists とMaps が常に Java オブジェクトのプロパティであり、ルートレベルの値ではないように、ラッパー オブジェクトを使用します。これにより、Restlet がルート値のジェネリック型を渡さなかった場合でも、型が機能することが保証されます。
  • HashSet非ジェネリック型になるようにサブクラス化します。その後、ジャクソンはジェネリック型を把握できますHashSet

2 番目のケースでは、次のようにします。

public class MyTraits extends HashSet<Trait> { }

@Get("json")
public MyTraits getTraits();

MyTraits独自のジェネリック型がないため、機能します。ただし、そのスーパータイプの宣言には、Jackson が使用できる汎用パラメーターがあります。

于 2012-10-21T01:06:36.827 に答える