Джексон подкласс сериализации

Я использую API Java, которым я не владею и не могу изменить. Этот API определяет класс Aggregation который является Immutables (immutables.github.io) абстрактный класс с сериализацией и десериализацией Джексона.

Класс выглядит как

@Value.Immutable
@JsonSerialize(as = Immutable_Aggregation.class)
@JsonDeserialize(as = Immutable_Aggregation.class)
public abstract class Aggregation {

Я хочу добавить поле агрегации, которое должно быть выбрано во время сериализации, но экземпляры которого все еще могут быть переданы методам, принимающим Aggregation,

Я хочу сделать что-то вроде:

public abstract class ExtendedAggregation extends Aggregation {}

Это возможно?

1 ответ

Решение

Мне не удалось наследовать между двумя классами, отмеченными @Value.Immutable как вы хотели, поэтому я попытался использовать Джексона для решения этой проблемы.

Нашел следующий подход, который использует @JsonAppend аннотации и mixins, чтобы добавить свойства, не касаясь Aggregation учебный класс.

Сначала определите смешанный класс с аннотацией:

@JsonAppend(
    attrs = {
        @JsonAppend.Attr(value = "version")
})
public class AggregationMixin {}

Зарегистрируйте Mixin на своем ObjectMapper пример:

mapper.addMixIn(Aggregation.class, AggregationMixin.class);

Сериализация класса путем создания выделенного ObjectWriter, в котором вы указываете значение добавленного свойства:

ObjectWriter writer = om.writerFor(Aggregation.class).withAttribute("version", "42");
...    
String output = writer.writeValueAsString(aggregationInstance);

@JsonAppend аннотацию можно настроить для получения ее значения множеством способов. Обратитесь к его документации для деталей.

Некоторое дальнейшее чтение:

http://www.baeldung.com/jackson-advanced-annotations http://wiki.fasterxml.com/JacksonMixInAnnotations

Другие вопросы по тегам