java專案,記錄頁面修改值,內部打“官司”用
阿新 • • 發佈:2021-11-26
java專案,記錄頁面修改值,內部打"官司“用
1、問題描述
業務需求:專案中的配置資訊,關係到程式跑出來資料準確性,需要記錄下什麼人、什麼時間、修改了什麼欄位,原來值、最新值,以便回溯,防止扯皮,內部打“官司”用。
2、解決方案
通過java反射,後臺程式比對前端傳入值與資料庫中值,並記錄下來;
2.1 測試實體類
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class User {
private String name;
private String des;
}
簡要說明:建立測試類User,兩個屬性;
2.2 工具類
import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Utils { public static<T> String compareObject(Object oldBean, Object newBean) { String str = ""; T pojo1 = (T) oldBean; T pojo2 = (T) newBean; try { Class clazz = pojo1.getClass(); Field[] fields = pojo1.getClass().getDeclaredFields(); int i = 1; for (Field field : fields) { PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod(); Object o1 = getMethod.invoke(pojo1); Object o2 = getMethod.invoke(pojo2); if (o1 == null || o2 == null) { continue; } if (!o1.toString().equals(o2.toString())) { if (i != 1) { str += ";"; } str += i + "、欄位:" + field.getName() + ",舊值:" + o1 + ",新值:" + o2; i++; } } } catch (Exception e) { e.printStackTrace(); } return str; } public static void main(String[] args) { User user1 = new User(); user1.setName("老王"); user1.setDes("帥哥"); User user2 = new User(); user2.setName("老王"); user2.setDes("靚仔"); String result = compareObject(user1,user2); System.out.println(result); } }
簡要說明:
(1)入參,物件型別要一致;
(2)其中的invoke是獲取具體比對值,pojo1和pojo2是傳入物件;
2.3 效果圖
從效果圖可以看出來,已經可以記錄變更值了;
需求補充:因為從前端過來的是json格式的資料,欄位是都是英文的,例如截圖中的des,對應頁面的展示欄位,不一定能對的上,使用自定義註解,轉成中文備註記錄;
2.4 自定義註解
import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface ColumnConf { String value() default ""; }
自定義註解;
2.5 自定義註解使用到實體類上
@Setter
@Getter
public class User {
@ColumnConf("名字")
private String name;
@ColumnConf("描述")
private String des;
}
2.6 工具方法稍微做下改動,增加一行,修改下取值,其他不動
ColumnConf columnConf = field.getAnnotation(ColumnConf.class); str += i + "、欄位:" + columnConf.value() + ",舊值:" + o1 + ",新值:" + o2;
2.7 改造後效果圖:
2.8 說明
至於儲存log,就不多說了,建立個log表存一下就好了。。
多資訊請關注公眾號:「軟體老王」,關注不迷路,軟體老王和他的IT朋友們,分享一些他們的技術見解和生活故
更多資訊請關注公眾號:「軟體老王」,關注不迷路,IT技術與相關乾貨分享,回覆關鍵字獲取對應乾貨,本文版權歸作者軟體老王所有,轉載需註明作者、超連結,否則保留追究法律責任的權利。