在Java类中共享公共变量

在Java类中共享公共变量,java,json,rest,jackson,fasterxml,Java,Json,Rest,Jackson,Fasterxml,下面的问题可能太天真了,但请帮我找到一个解决方案 我正在开发JavaRESTfulAPI,在这里我以JSON格式发送响应格式。由于要设计多个API,我考虑在抽象类中保留一些公共变量,并尽可能重用它们。下面是我设计的两个抽象类 public @Data abstract class AbstractEntityWebServResDTO<D> { // Attributes ////////////// protected Date createdDt;

下面的问题可能太天真了,但请帮我找到一个解决方案

我正在开发JavaRESTfulAPI,在这里我以JSON格式发送响应格式。由于要设计多个API,我考虑在抽象类中保留一些公共变量,并尽可能重用它们。下面是我设计的两个抽象类

public @Data abstract class AbstractEntityWebServResDTO<D> {

    // Attributes
    //////////////
    protected Date createdDt;
    protected String createdBy;
    protected Date updatedDt;
    protected String updatedBy;

}
响应DTO的另一个示例

public @Data class ResponseFormat2 extends AbstractModifyWebServReqDTO<ResponseFormat2>{

    protected String response2Data;

}
如上所示,这些类扩展了与它们相关的不同抽象类。但在某些情况下,我需要使用两个抽象类中存在的所有变量。由于我们不能扩展2个抽象类,我如何才能实现这一点

我想到的解决方案是:

  • 创建一个包含所有变量的抽象类并使用它。但是,当我使用FasterXML将DTO转换为JSON格式时。它将在响应格式中引入所有不需要的变量
  • 用另一个抽象类扩展抽象。扩展类将生成相同的JSON格式,其中包含不需要的变量
  • 使用变量创建接口-但是接口中的变量应该是静态的或最终的

请帮助强调是否有任何解决方案可以避免在JSON中发送不需要的键

使用组合而不是继承

例如:

public class CreateInfo {

          protected String updatedDt;
          protected String updatedBy;
}



public class UpdateInfo {

          protected Date updatedDt;
          protected String updatedBy;
}


public class FinalModel {

          protected CreateInfo createInfo;
          protected UpdateInfo updateInfo;
}

通过这种方式,您的模型比继承灵活得多,在大多数情况下使用继承并不是一种好的做法。

如果您需要来自
抽象类的属性,请使用composition和
com.fasterxml.jackson.annotation.JsonUnwrapped
注释

class ResponseFormatAll {
    @JsonUnwrapped
    private AbstractEntityWebServResDTO res;

    @JsonUnwrapped
    private AbstractModifyWebServReqDTO req;
}

从现在起,两个抽象类中的所有字段都会出现在您的响应中。

Hi-Michal,示例中显示的DTO仅用于解释。此外,我还计划使用泛型来限制其他普通类。喜欢因此,符合此要求的类只能使用它。如果我错了,请纠正我。非常感谢。@Chethan,int,这种情况下泛型是有意义的。我还以为你已经上了完整的课呢。
public @Data class ResponseFormat2 extends AbstractModifyWebServReqDTO<ResponseFormat2>{

    protected String response2Data;

}
{
  "response2Data": "SOME DATA",
  "delete": true,
  "modify": false
}
public class CreateInfo {

          protected String updatedDt;
          protected String updatedBy;
}



public class UpdateInfo {

          protected Date updatedDt;
          protected String updatedBy;
}


public class FinalModel {

          protected CreateInfo createInfo;
          protected UpdateInfo updateInfo;
}
class ResponseFormatAll {
    @JsonUnwrapped
    private AbstractEntityWebServResDTO res;

    @JsonUnwrapped
    private AbstractModifyWebServReqDTO req;
}