工具
/**
* @param obj1 进行属性比较的对象1
* @param obj2 进行属性比较的对象2
* @param ignoreArr 选择忽略比较的属性数组
* @return 属性差异比较结果 map
*/
@SuppressWarnings("rawtypes")
public static Map<String, List<Object>> compareFields(Object obj1,Object obj2,String[] ignoreArr){
try {
Map<String, List<Object>> map = new HashMap<String, List<Object>>();
List<String> ignoreList = null;
if (ignoreArr !=null && ignoreArr.length>0) {
ignoreList = Arrays.asList(ignoreArr);
}
if (obj1.getClass() == obj2.getClass()) { //只有两个对象都是同一类型才有可比性
Class clazz = obj1.getClass();
//获取object的属性描述
PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String name = pd.getName();
if (ignoreList !=null && ignoreList.contains(name)) {
continue;
}
Method readMethod = pd.getReadMethod();//获取属性的get方法
//在obj1上调用get方法等同于获得obj1的属性值
Object o1 = readMethod.invoke(obj1);
//在obj2上调用get方法等同于获得obj2的属性值
Object o2 = readMethod.invoke(obj2);
//如果此属性是时间
if (o1 instanceof Timestamp) {
o1 = new Date(((Timestamp)o1).getTime());
}
if (o2 instanceof Timestamp) {
o2 = new Date(((Timestamp)o2).getTime());
}
if (o1 == null && o2 == null) {
continue;
}else if (o1 == null && o2 !=null) {
//不一致
List<Object> list = new ArrayList<Object>();
list.add(o1);
list.add(o2);
map.put(name, list);
continue;
}
if (!o1.equals(o2)) {
List<Object> list = new ArrayList<>();
list.add(o1);
list.add(o2);
map.put(name, list);
}
}
}
return map;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
用法
Long id = Long.valueOf(req.getParameter("id"));
ResponseBean rbOld = this.fhysryxxService.getFhysryxxmx(id);
ResponseBean rbNew = this.fhysryxxService.getFhysryxxmxMirror(id);
FhysryxxResult fhysryxxResultOld = (FhysryxxResult)rbOld.getResult();
FhysryxxResult fhysryxxResultNew = (FhysryxxResult)rbNew.getResult();
Map<String, ArrayList<XtXgrzmxDTO>> map = new HashMap<>();
ArrayList<XtXgrzmxDTO> xtXgrzmxDTOS = new ArrayList<>();
Map<String, List<Object>> compareResult = compareFields(fhysryxxResultOld, fhysryxxResultNew,
new String[] {"id","zgbjlshsj","zgbjlshyj","zgbjlshqm","zlfzrshqm","zlfzrshyj","zlfzrshsj",
"ecsh","shzt","zfbz","ccbjlshqm","ccbjlshyj","ccbjlshsj","cjr","cjrq","xgr","xgrq","tjr","tjrq"});
/**
list.get(0) 旧值 list.get(1)新值 key 就是实体字段
*/
Set<String> keySet = compareResult.keySet();
for (String key : keySet) {
List<Object> list = compareResult.get(key);
XtXgrzmxDTO xtXgrzmxDTO = new XtXgrzmxDTO();
xtXgrzmxDTO.setXgzdmc(FhysryxxEnum.of(key));
xtXgrzmxDTO.setXz(list.get(1).toString());
xtXgrzmxDTO.setYz(list.get(0).toString());
xtXgrzmxDTOS.add(xtXgrzmxDTO);
}
实体字段怎么转中文,用枚举
package cn.sckj.erp.xs.enums;
public enum FhysryxxEnum {
WTJBF("wtjbf","委托经办人"),
SFZH("sfzh","身份证号"),
CPH("cph","车牌号"),
JSZHM("jszhm","驾驶证号码"),
CYDW("cydw","承运单位"),
FHDZ("fhdz","发货地址"),
YSGJ("ysgj","运输工具"),
YSSX("yssx","运输时限"),
WDYQ("wdyq","温度要求"),
MRBZ("mrbz","默认标志"),
JSY("jsy","驾驶员"),
ZCDZ("zcdz","注册地址"),
FDDBR("fddbr","法定代表人"),
LXDH("lxdh","联系电话"),
YYZZ("yyzz","营业执照"),
YYZZYXQ("yyzzyxq","营业执照有效期"),
DLJYXKZ("dljyxkz","道路经营许可证"),
DLJYXKZYXQ("dljyxkzyxq","道路经营许可证有效期"),
WTYSXY("wtysxy","委托运输协议"),
WTYSXYYXQ("wtysxyyxq","委托运输协议有效期"),
JSZYXQ("jszyxq","驾驶证有效期"),
SFZYXQ("sfzyxq","身份证有效期"),
XSZ("xsz","行驶证"),
XSZYXQ("xszyxq","行驶证有效期"),
TJBGYXQ("tjbgyxq","体检报告有效期"),
CXYXQ("cxyxq","车险有效期");
private final String py;
private final String chinese;
FhysryxxEnum(String py,String chinese){
this.py = py;
this.chinese = chinese;
}
public String getPy() {
return py;
}
public String getChinese() {
return chinese;
}
public static String of(String py){
for (FhysryxxEnum testEum : FhysryxxEnum.values()) {
if (testEum.getPy().equals(py)) {
return testEum.getChinese();
}
}
return null;
}
}
FhysryxxEnum.of(key) 就可以转成对应中文