Джексон подкласс сериализации
Я использую 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