Второй тест 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);
}