以下问题可能太幼稚,但是请帮助我找到解决方案。

我正在使用Java RESTful API,以JSON格式发送响应格式。由于要设计多个API,因此我想到了将一些公共变量保留在Abstract类中,并尽可能重用。下面是我设计的2个抽象类。

public @Data abstract class AbstractEntityWebServResDTO<D> {

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

}


public @Data abstract class AbstractModifyWebServReqDTO<D> {

    // Attributes
    //////////////
    protected boolean delete;
    protected boolean modify;

}


响应DTO的一些示例。

public @Data class ResponseFormat1 extends AbstractEntityWebServResDTO<ResponseFormat1>{

    protected String response1Data;

}


这将产生JSON:

{
  "response1Data": "SOME DATA",
  "createdDt": "2019-11-02 23:33:23",
  "createdBy": "USERID",
  "updatedDt": "2019-11-02 23:33:23",
  "updatedBy": "USERID"
}



响应DTO的另一个示例

public @Data class ResponseFormat2 extends AbstractModifyWebServReqDTO<ResponseFormat2>{

    protected String response2Data;

}


这将产生JSON:

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


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

我想到的解决方案:


创建具有所有变量的单个抽象类并使用它。但是当我使用FasterXML将DTO转换为JSON格式时。它将以响应格式带来所有不需要的变量。
用另一个Abstract类扩展Abstract。扩展类将产生相同的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;
}


这样,您的模型比继承要灵活得多,在大多数情况下,使用继承不是一个好习惯。

10-07 19:43
查看更多