根据业务需求调用核心业务系统接口,其中接口要求传输JSON数据格式,将Java对象数据直接转换为JSON数据格式;同时该Java对象随时都有可能根据业务需求变动被增加新的数据字段,而调用接口时并不需要额外的字段,如果再用该Java对象数据转换的JSON数据,就会出现调用接口参数不正确的情况,
如:接口系统要求的JSON数据格式:{"body":{"data":{"bankAccount":"","bankCode":"","orderNo":""},"sign":""}};
而根据 AddPremiumBean 实体类转换成的JSON数据格式:{"body":{"data":{"accountName":"","bankAccount":"","bankCode":"","orderNo":""},"sign":""}},显然多一个字段,不符合要求。
解决方法:
为了避免对AddPremiumBean修改造成其它影响,如在AddPremiumBean实体类中增加新字段。为了能够复用 AddPremiumBean 对象数据,则专门定义一个对应接口的实体类 BodyAddPremiumBean,以实现对AddPremiumBean对象数据的复制,从而达到对数据的获取。
public class AddPremiumBean implements Cloneable{
private String orderNo;
private String accountName;
private String bankCode;
private String bankAccount;
// 分别对所有属性实现get/set方法
public Object clone() throws CloneNotSupportedException{
AddPremiumBean addPremiumParam = (AddPremiumBean) super.clone();
return addPremiumParam;
}
}
public class BodyAddPremiumBean implements Cloneable{
// 分别对所有属性实现get/set方法
private String orderNo;
private String bankCode;
private String bankAccount;
public AddPremiumBean addPremiumParam;
public BodyAddPremiumBean(){
}
// 通过构造函数传递对象
public BodyAddPremiumBean(AddPremiumBean addPremiumParam){
super();
this.addPremiumParam = addPremiumParam;
}
// 深度克隆:addPremiumParam非基本类型变量,而是引用类型变量
public Object clone() throws CloneNotSupportedException{
BodyAddPremiumBean bodyAddPremium = (BodyAddPremiumBean) super.clone();
bodyAddPremium.addPremiumParam = (AddPremiumBean) addPremiumParam.clone();
return bodyAddPremium;
}
}
上述代码中并没有对当前对象属性赋值,而仅对对象引用进行了克隆;需要再对 BodyAddPremiumBean 类clone()方法 进行改造,运用反射机制进行类属性克隆,代码如下:
public Object clone() throws CloneNotSupportedException{
BodyAddPremiumBean bodyAddPremium = null;
try {
bodyAddPremium = (BodyAddPremiumBean) super.clone();
bodyAddPremium.addPremiumParam = (AddPremiumBean) addPremiumParam.clone();
Class<?> sclasss = this.getClass();
Class<?> fclasss = bodyAddPremium.addPremiumParam.getClass();
Field[] sfields = sclasss.getDeclaredFields();
Field[] ffields = fclasss.getDeclaredFields();
for(Field sfield : sfields){
for(Field ffield : ffields){
ffield.setAccessible(true);
if(sfield.getName().equals(ffield.getName())){
sfield.set(bodyAddPremium, ffield.get(bodyAddPremium.addPremiumParam));
}
}
}
} catch (CloneNotSupportedException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return bodyAddPremium;
}