我正在使用我不拥有且无法修改的Java API。该API定义了Aggregation
类,即Immutables
(Immutables.github.io)带有Jackson Serialization和queserialization的抽象类。
班级看起来像
@Value.Immutable
@JsonSerialize(as = Immutable_Aggregation.class)
@JsonDeserialize(as = Immutable_Aggregation.class)
public abstract class Aggregation {
我想将一个字段添加到聚合中,该字段应在序列化时拾取,但是其实例仍然可以传递给接受Aggregation
的方法。
我想做类似:
的事情public abstract class ExtendedAggregation extends Aggregation {}
这是可能的吗?
我尚未设法在两个标记的@Value.Immutable
上继承,因此我尝试使用Jackson来解决问题。
找到了以下方法,该方法使用@JsonAppend
注释和Mixins添加属性而无需触摸Aggregation
类。
首先,用注释定义一个混合类:
@JsonAppend(
attrs = {
@JsonAppend.Attr(value = "version")
})
public class AggregationMixin {}
用您的ObjectMapper
实例注册Mixin:
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#jsonappendhttp://wiki.fasterxml.com/jacksonmixinannotations