以下问题可能太幼稚,但是请帮助我找到解决方案。
我正在使用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个抽象类,我该如何实现?
我想到的解决方案:
请帮助突出显示是否有可用的解决方案来避免在JSON中发送不需要的密钥?
答案 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;
}
从现在开始,您的响应中将出现两个抽象类的所有字段。