在Java类中共享公共变量

时间:2019-11-02 16:17:57

标签: java json rest jackson fasterxml

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

我正在使用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
}

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

我想到的解决方案:

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

请帮助突出显示是否有可用的解决方案来避免在JSON中发送不需要的密钥?

2 个答案:

答案 0 :(得分:0)

使用合成代替继承

示例:

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;
}

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

答案 1 :(得分:0)

如果同时需要abstract类的属性,请使用composition和com.fasterxml.jackson.annotation.JsonUnwrapped批注。

class ResponseFormatAll {
    @JsonUnwrapped
    private AbstractEntityWebServResDTO res;

    @JsonUnwrapped
    private AbstractModifyWebServReqDTO req;
}

从现在开始,您的响应中将出现两个抽象类的所有字段。