Java 防止Jackson@JsonIgnore引入复制

Java 防止Jackson@JsonIgnore引入复制,java,json,design-patterns,jackson,Java,Json,Design Patterns,Jackson,我正在开发一个这样架构的应用程序。 BaseObject包含以下字段: public class BaseObject { private String id; private Instant creationDate; private String createdBy; private Instant lastEditionDate; private String lastEditBy; private Instant del

我正在开发一个这样架构的应用程序。
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;
}
public interface BaseObjectInterface {
    String getId();
    Instant getCreationDate();
    // etc
}
这两个POJO没有功能关系。它们由子项目构成,子项目以函数方式对字段进行分组

我的问题来了。我的应用程序正在通过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 */
}
public interface FlatData extends BaseObjectInterface {
    @Override
    @JsonIgnore
    default String getId() {
        BaseObjectInterface.super.getId(); // Error
    }
我的解决方案正在运行,BI应用程序正确格式化了数据,我仍然可以使用子对象处理我的对象

困扰我的是代码重复。对于每个平面对象,我必须覆盖BaseObject的每个getter。我不想

Java不允许多重继承,所以我不能创建一个抽象类@JsonIgnore每个BaseObject字段并扩展我的Pojo1

我尝试使用如下界面:

public class Pojo1 extends BaseObject {
    private SubPojo1 subPojo1;
    private SubPojo2 subPojo2;
}

public class Pojo2 extends BaseObject {
    private SubPojo3 subPojo3;
    private SubPojo4 subPojo4;
}
public interface BaseObjectInterface {
    String getId();
    Instant getCreationDate();
    // etc
}
我的BaseObject现在实现BaseObjectInterface,一切正常。然后计划创建一个FlatData接口,该接口将@JsonIgnore BaseObject字段,每个FlatPojo将实现该接口。我想到了这个:

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 */
}
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