我正在开发以这种方式构建的应用程序。
BaseObject包含以下字段:
public class BaseObject {
private String id;
private Instant creationDate;
private String createdBy;
private Instant lastEditionDate;
private String lastEditBy;
private Instant deletionDate;
private String deletedBy;
}
每个类都扩展了此BaseObject,所以我最终得到两个像这样的POJO:
public class Pojo1 extends BaseObject {
private SubPojo1 subPojo1;
private SubPojo2 subPojo2;
}
public class Pojo2 extends BaseObject {
private SubPojo3 subPojo3;
private SubPojo4 subPojo4;
}
这两个POJOS没有功能关系。它们由SubPojo组成,以功能性的方式对字段进行分组。
我的问题来了。我的应用程序通过JSON将数据发送到BI应用程序。 BI应用程序需要将POJO设置为“平面”格式,并且我想排除BaseObject字段。
所以我想出了这个:
public class FlatPojo1 extends Pojo1 {
@Override
@JsonIgnore
public String getId() {
return super.getId();
}
/* Override every getter of BaseObjet */
@Override
@JsonUnwrapped
public SubPojo1 getSubPojo1 {
return super.getSubPojo1();
}
/* Override every getter of Pojo1 */
}
我的解决方案正在运行,BI应用程序已正确格式化了数据,但我仍然可以使用子对象处理对象。
困扰我的是代码重复。对于每个平面对象,我必须重写BaseObject的每个getter。我不想。
Java不允许多重继承,因此我无法创建一个抽象类,该抽象类@JsonIgnore每个BaseObject字段并扩展我的Pojo1。
我试图提供这样的接口:
public interface BaseObjectInterface {
String getId();
Instant getCreationDate();
// etc
}
我的BaseObject现在实现了BaseObjectInterface,一切正常,然后计划创建一个FlatData接口,该接口将@JsonIgnore BaseObject字段,每个FlatPojo都将实现此接口。我想出了这个:
public interface FlatData extends BaseObjectInterface {
@Override
@JsonIgnore
default String getId() {
BaseObjectInterface.super.getId(); // Error
}
我收到一条错误消息,告诉我不能调用抽象方法。而且我无法在BaseObjectInterface中创建默认的getId()方法,因为这样将需要一个id字段,并且接口中的每个字段都是静态的。
我找不到避免重复所有@JsonIgnore的方法。有什么办法吗?
谢谢您的帮助。
最佳答案
您可以使用Mixin批注,在该接口中添加批注:
public interface BaseObjectMixIn {
@JsonIgnore
String getId();
... rest of annotations for superclass
}
这样,您无需添加任何东西,只需将mixin添加到映射器即可:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Pojo1.class, BaseObjectMixIn.class);
String json = mapper.writer().writeValueAsString(pojo1);
如果每个BaseObject子类都需要它:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(BaseObject.class, BaseObjectMixIn.class);
但是,一个没有mixin且仅向子类添加接口的简单解决方案是:
public interface BaseOjectInterface {
@JsonIgnore
String getId();
}
public static class Pojo1 extends BaseObject implements BaseOjectInterface {
private String subPojo1;
private String subPojo2;
这将避免在序列化Pojo1时从BaseObject发送ID