Как мы можем предотвратить сериализацию полей подтипа параметра типа в jackson / json? - PullRequest
0 голосов
/ 16 ноября 2018

Второй тест junit сериализует экземпляр класса, который имеет параметр типа.Экземпляр имеет тип ParametricType<SubType>.Сериализатор был инициализирован с использованием constructParametricType(ParametricType.class, SuperType.class) в качестве информации о типе.Мы можем видеть, что мы инициализировали сериализатор с супертипом SuperType для параметра типа.Теперь мы ожидаем получить сериализованный json, содержащий только поля типа super.Но поле B подтипа также включено.

Это работает в первом примере, где мы не заключаем нашу SuperType в ParametricType.

Так что же мыотсутствует, чтобы получить только поля супертипа в качестве сериализованного вывода, когда мы используем параметрический тип?

public static class SuperType {
    public int A;
}

public static class SubType extends SuperType {
    public int B;
}

public static class ParametricType<T> {
    public T Value;
}

@Test
public void doNotSerializeSubClassFieldsTest() throws Exception {
    var mapper = new ObjectMapper();
    var writer = mapper.writerFor(SuperType.class);

    var subType = new SubType();
    subType.A = 1;
    subType.B = 2;

    var expectedValue = "{\"A\":1}";
    var data = writer.writeValueAsString(subType);

    assertEquals(expectedValue, data);
}

@Test
public void serializeNotSubclassAuthenticatedMessageTest() throws Exception {
    var mapper = new ObjectMapper();
    var javaType = mapper.getTypeFactory().constructParametricType(ParametricType.class, SuperType.class);
    var writer = mapper.writerFor(javaType);

    var subType = new SubType();
    subType.A = 1;
    subType.B = 2;
    var parametricType = new ParametricType<>();
    parametricType.Value = subType;

    var expectedValue = "{\"Value\":{\"A\":1}}";
    var data = writer.writeValueAsString(parametricType);

    // it is actually "{\"Value\":{\"A\":1,\"B\":2}}"
    assertEquals(expectedValue, data);
}
...