8

@JsonTypeInfo を使用して、Jackson 2.1.0 に「discriminator」プロパティで具体的な型情報を調べるように指示しています。これはうまく機能しますが、逆シリアル化中に Discriminator プロパティが POJO に設定されません。

Jackon の Javadoc (com.fasterxml.jackson.annotation.JsonTypeInfo.Id) によると、次のようにする必要があります。

/**
 * Property names used when type inclusion method ({@link As#PROPERTY}) is used
 * (or possibly when using type metadata of type {@link Id#CUSTOM}).
 * If POJO itself has a property with same name, value of property
 * will be set with type id metadata: if no such property exists, type id
 * is only used for determining actual type.
 *<p>
 * Default property name used if this property is not explicitly defined
 * (or is set to empty String) is based on
 * type metadata type ({@link #use}) used.
 */
public String property() default "";

ここに失敗したテストがあります

 @Test
public void shouldDeserializeDiscriminator() throws IOException {

    ObjectMapper mapper = new ObjectMapper();
    Dog dog = mapper.reader(Dog.class).readValue("{ \"name\":\"hunter\", \"discriminator\":\"B\"}");

    assertThat(dog).isInstanceOf(Beagle.class);
    assertThat(dog.name).isEqualTo("hunter");
    assertThat(dog.discriminator).isEqualTo("B"); //FAILS
}

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "discriminator")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Beagle.class, name = "B"),
        @JsonSubTypes.Type(value = Loulou.class, name = "L")
})
private static abstract class Dog {
    @JsonProperty("name")
    String name;
    @JsonProperty("discriminator")
    String discriminator;
}

private static class Beagle extends Dog {
}

private static class Loulou extends Dog {
}

何か案は ?

4

1 に答える 1

23

次のように「visible」プロパティを使用します。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "discriminator", visible=true)

次に、型プロパティを公開します。デフォルトでは表示されないため、このメタデータに明示的なプロパティを追加する必要はありません。

于 2013-01-03T20:05:25.143 に答える