1

次のような基本クラスがあります。

public class Criteria {
    private CriteriaType type;
        //getters & setters
        public enum CriteriaType {
        Condition, Medication
    }
}

および派生クラス

public class ConditionCriteria extends Criteria {
    private String a;
        //getters & setters
}

public class MedicationCriteria extends Criteria {
    private String b;
        //getters & setters
}

そして別のクラス

public class CriteriaGroup {
    Criteria criteria;
        //getters & setters
}

CriteriaGroup(デ) シリアル化のために Jackson を使用して、クラスのシリアル化された JSON 文字列をサーバーに送信します。サーバー上のサービスは次のようになります。

@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createCriteriaGroup(CriteriaGroup criteriaGroup) {...

ただし、JAckson は逆シリアル化された JSON を派生クラスの 1 つに変換しません。クラスのtypeフィールドに従って、このマッピングをどのように達成できますか?Criteria

ありがとう..

ConditionCriteria の JSON をデシリアライズすると、次のような例外が発生します。

SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "a" (Class Criteria), not marked as ignorable
 at [Source: org.eclipse.jetty.server.HttpInput@3c92218c; line: 1, column: 92] (through reference chain: CriteriaGroup["criteria"]->Criteria["a"])
        at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
        at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)

....

4

1 に答える 1

0

ポリモーフィック型をサポートするには、追加の型情報を使用できるようにするために追加@JsonTypeInfoする必要があります。Criteriaその例を見つけることができるはずです(「jacksonJsonTypeInfo」をグーグルで検索してください)。

于 2013-01-26T00:27:58.727 に答える