一 需求
通用实体类字段的对比来生成日志
/**
* 对象编辑:生成字段差异信息
* @param oldObj 编辑前对象
* @param newObj 编辑后对象
* @param objMap 编辑对象所有字段
* @param unCompare 不需要比对的字段
* @param enumFiled 需要用到枚举的字段
* @param hyperlink 需要设置成超链接的字段
* @author qianyongchao
* @date 2018/11/09
*/
public static StringBuffer createFiledsDiffrents(Object oldObj, Object newObj, Map<String, String> objMap, List<String>
unCompare, List<String> enumFiled, List<String> hyperlink) {
StringBuffer buffer = new StringBuffer();
Field[] fields = oldObj.getClass().getDeclaredFields();
Field[] fields1 = oldObj.getClass().getDeclaredFields();
Field[] fields2 = newObj.getClass().getDeclaredFields();
for (int m = 0; m < fields.length; m++) {
Field f1 = fields1[m];
Field f2 = fields2[m];
f1.setAccessible(true); // 设置些属性是可以访问的
f2.setAccessible(true); // 设置些属性是可以访问的
try {
//字段对应值
Object val1 = new Object();
Object val2 = new Object();
val1 = f1.get(oldObj);
val2 = f2.get(newObj);
//排除字段的比较
if(unCompare.contains(f1.getName())) {
continue;
}
if (val1 == null) {
//如果都为空 不计入日志
if ("".equals(val2) || val2 == null) {
continue;
}
// 将图片 设置成超链接
if(hyperlink != null && hyperlink.size() > 0) {
if(hyperlink.contains(f1.getName())) {
String resultText1 = "<a href=\"" + val1 + "\">" + val1 + "</a>";
String resultText2 = "<a href=\"" + val2 + "\">" + val2 + "</a>";
buffer.append(objMap.get(f1.getName()) + " : " + resultText1 + " -> " + resultText2 + "; ");
continue;
}
}
buffer.append(objMap.get(f1.getName()) + " : " + val1 + " -> " + val2 + "; ");
} else if (val1.equals(val2) == false) {
if(enumFiled.contains(f1.getName())) {
if ("status".equals(f1.getName())) {
buffer.append(objMap.get(f1.getName()) + " : " + StatusEnum.fromCode(val1.toString()).getMsg() + " -> " + StatusEnum
.fromCode(val2.toString()).getMsg() + "; ");
continue;
}
buffer.append(objMap.get(f1.getName()) + " : " + DefaultBooleanStatus.fromCode(val1.toString()).getMsg() + " -> " + DefaultBooleanStatus
.fromCode(val2.toString()).getMsg() + "; ");
continue;
}
//设置成超链接
if(hyperlink != null && hyperlink.size() > 0) {
if(hyperlink.contains(f1.getName())) {
String resultText1 = "<a href=\"" + val1 + "\">" + val1 + "</a>";
String resultText2 = "<a href=\"" + val2 + "\">" + val2 + "</a>";
buffer.append(objMap.get(f1.getName()) + " : " + resultText1 + " -> " + resultText2 + "; ");
continue;
}
}
buffer.append(objMap.get(f1.getName()) + " : " + val1 + " -> " + val2 + "; ");
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return buffer;
}
二 注意
- 需要的参数都已经清楚了,额外要注意的是,后台要生成一个map,filed -> 实际意义,不然日志中,都是某某字段: xxx -> xxx
- 如果有图片更改,这里将图片地址设置成了超链接,后台日志中可以直接点击查看图片,所以说很方便!
- 日志中,可能会出现 null -> "",这种情况
- 好了,写完这个工具类还是很开心的,毕竟也方便了同事的开发,好的东西要学会分享嘛。有高见的同学,可以联系博主,谢谢啦!