1

RESTeasy を使用して、JSON をペイロードから Web サーバーの POJO に変換しています。これらの POJO メンバーの 1 つが一般的な場合、問題が発生します。

例えば:

public class MainPOJO
{
    private MyParentClass c;

    [...]
}

public class MyParentClass
{
    [...]
}

public class MyFirstChildClass extends MyParentClass
{
    private int number;

    [...]
}

public class MySecondChildClass extends MyParentClass
{
    private boolean isTrue;

    [...]
}

クライアントによって作成されたリクエスト ペイロード (PUT) では、次の json のようなものを見つけることができます (「c」属性で json 形式の MyFirstChildClass に相当するものを送信していることに注意してください)。

{
    c: {number:10}
}

MainPOJO のプロパティ「c」が MyParentClass、MyFirstChildClass、または MySecondChildClass のいずれかのインスタンスになることを RESTeasy に伝える方法はありますか?

現在、MyParentClass の新しいインスタンスをインスタンス化しようとしているだけですが、そのプロパティ、たとえば "number" が無視可能としてマークされていないというエラーがスローされます。しかし、JSON のプロパティに従って、よりインテリジェントで、ツリー内の適切なクラスからオブジェクトをインスタンス化できることを願っています。

出来ますか?

ありがとう!

4

1 に答える 1

1

Jackson プロバイダーを使用していると仮定すると、これを処理する最良の方法はJsonTypeInfoアノテーションを使用することです。これを使用すると、Jackson に、生成された JSON に含まれる型ヒントが必要であり、逆シリアル化に関して実際の型を解決するために使用できることが通知されます。

シリアル化されているときに常に型情報を含めるにMyParentClassは、クラス自体に注釈を付けます。

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
public class MyParentClass {
}

MyParentClassまたは、オブジェクトがシリアル化されているときの型情報のみを含めるにはMainPojo、フィールドに注釈を付けます。

public class MainPOJO {
    @JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class")
    private MyParentClass c;
}

オーバーライドとオプションの詳細については、JsonTypeInfo に関する Jackson のドキュメントを参照してください。

于 2013-02-01T14:39:15.083 に答える