因需要记录对应业务数据更新前后数据差异,但又不能记录所有数据,这样不好查看,需要记录又修改有差异的数据值,所以写了一个工具类,配合swagger注释来获取对象属性描述。
/**
* 对比数据更新前后数据存在属性差异的内容
* @param oldObject 旧数据
* @param newObject 新数据
* @param <T> 返回数据对比详细
* @return
*/
public static <T> ChangeContentObj compareInstance(T oldObject, T newObject) {
ChangeContentObj result = new ChangeContentObj();
Class sourceClass = oldObject.getClass();
List<Field> fields = new ArrayList<>();
// 循环获取父类所有字段
while (sourceClass != null) {
fields.addAll(Arrays.asList(sourceClass.getDeclaredFields()));
sourceClass = sourceClass.getSuperclass();
}
Map<String, String> oldMap = new HashMap<>(fields.size());
Map<String, String> newMap = new HashMap<>(fields.size());
for (Field field : fields) {
try {
// 获取swagger注释内容
ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
String fileName = annotation.value() + "(" + field.getName() + ")";
field.setAccessible(true);
if (field.get(oldObject) != null) {
if (!field.get(oldObject).equals(field.get(newObject))) {
// 记录前后属性值差异对比
oldMap.put(fileName, field.get(oldObject) + "");
newMap.put(fileName, field.get(newObject) + "");
}
} else {
if (field.get(newObject) != null) {
// 记录前后属性值差异对比
oldMap.put(fileName, "空");
newMap.put(fileName, field.get(newObject) + "");
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
result.setNewContent(newMap);
result.setOldContent(oldMap);
return result;
}
返回结果类
/**
* @author Peng
* @program springboot
* @description
* @create 2022/4/11 17:51
**/
@Data
public class ChangeContentObj {
/**
* 旧数据内容
*/
private Map<String, String> oldContent;
/**
* 新数据内容
*/
private Map<String, String> newContent;
}
测试结果:
public static void main(String[] args) {
ObjectCompareObject object1 = new ObjectCompareObject();
// object1.setUserName("张三");
object1.setUserNumber("1001");
object1.setUserId(1L);
ObjectCompareObject object2 = new ObjectCompareObject();
object2.setUserName("张三");
object2.setUserNumber("1002");
object2.setUserId(1L);
ChangeContentObj changeContentObj = compareInstance(object1, object2);
System.out.println(changeContentObj);
}
结果:
ChangeContentObj(oldContent={用户姓名(userName)=空, 用户工号(userNumber)=1001},
newContent={用户姓名(userName)=张三, 用户工号(userNumber)=1002})