需求:实现前端页面修改提交的bean与数据库存储的bean的字段值差异对比并输出
示例:商品详情修改页面,商品有价格,规格,类别,国条码,保质期,预警天数等字段,现在需要记录下每次编辑商品提交,对应有变动的字段字段中文名和变动前后的值,生成对应日志
实现:反射+swagger
具体代码
工具类
package generator.util;
import generator.entity.TestBean;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSON;
/**
* @author: feihualiuxuyingqinming
* @since: 2023/11/28 16:04
* @description: 比对对象信息
*/
public class CompareObjectUtil {
/**
* @param oldBean
* @param newBean
* @return void
* @author feihualiuxuyingqinming
* @date 2023/11/28 17:54
* @desc 比对对象字段 打印成字符串
**/
public static void compareObject(Object oldBean, Object newBean) {
try {
Class s = oldBean.getClass();
Field[] fields = s.getDeclaredFields();
StringBuffer stringBuffer = new StringBuffer();
for (Field field : fields) {
field.setAccessible(Boolean.TRUE);
Object val1 = field.get(oldBean);
Object val2 = field.get(newBean);
//获取字段swagger注解
ApiModelProperty fieldAnnotation = field.getAnnotation(ApiModelProperty.class);
if (fieldAnnotation == null) continue;
String desc = fieldAnnotation.value();
if (val1 == null || val2 == null) {
if (!(val1 == null && val2 == null)) {
stringBuffer.append(desc + "由");
String v = "空";
if (val1 == null) {
stringBuffer.append(v).append("修改为");
if (val1 instanceof String || val1 instanceof Integer || val1 instanceof Long || val1 instanceof Date || val1 instanceof BigDecimal) {
stringBuffer.append(val2.toString());
} else if (val1 instanceof List) {
stringBuffer.append(convertListToString((List<Object>) val2));
} else if (val2 instanceof Map) {
stringBuffer.append(convertMapToString((Map) val2));
}
stringBuffer.append("\n");
} else {
if (val1 instanceof String || val1 instanceof Integer || val1 instanceof Long || val1 instanceof Date || val1 instanceof BigDecimal) {
stringBuffer.append(val1.toString());
} else if (val1 instanceof List) {
stringBuffer.append(convertListToString((List<Object>) val1));
} else if (val1 instanceof Map) {
stringBuffer.append(convertMapToString((Map) val1));
}
stringBuffer.append("修改为").append(v).append("\n");
}
}
} else {
stringBuffer.append(desc + "由");
//通过hash判断值是否相同
if (val1.hashCode() != val2.hashCode()) {
if (val1 instanceof String || val1 instanceof Integer || val1 instanceof Long || val1 instanceof Date || val1 instanceof BigDecimal) {
stringBuffer.append(val1.toString()).append("修改为").append(val2.toString()).append("\n");
} else if (val1 instanceof List) {
stringBuffer.append(convertListToString((List<Object>) val1)).append("修改为").append(convertListToString((List<Object>) val2)).append("\n");
}
}
if (val1 instanceof Map) {
if(!val1.equals(val2)) {
stringBuffer.append(convertMapToString((Map)val1)).append("修改为").append(convertMapToString((Map) val2));
}
}
}
}
System.out.println(stringBuffer);
}catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static String convertListToString(List<Object> list) {
return list.stream().map(it -> it.toString()).collect(Collectors.joining(",", "[", "]"));
}
public static String convertMapToString(Map map) {
String jsonString = JSON.toJSONString(map);
return jsonString;
}
public static void main(String[] args) {
TestBean TestBeanA = TestBean.builder().a(1)
.b("2").c(Arrays.asList(1, 2, 3, 4)).d(new HashMap() {{put("1","1");}}).build();
TestBean TestBeanB = TestBean.builder().a(2)
.b("3").c(Arrays.asList(2, 3, 4, 5)).d(new HashMap() {{put("2","2");}}).build();
compareObject(TestBeanA,TestBeanB);
}
}
测试实体
```java
package generator.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* @author: feihualiuxuyingqinming
* @since: 2023/11/28 20:27
* @description:
*/
@Data
@ApiModel
@Builder
public class TestBean {
@ApiModelProperty(value = "商品id")
private Integer a;
@ApiModelProperty(value = "商品名称")
private String b;
@ApiModelProperty(value = "商品类别")
private List<Object> c;
@ApiModelProperty(value = "测试字段D")
private Map d;
}
运行结果示例:

拓展:这里为了获取字段中文描述,是直接在实体bean上加上swagger注解,通过反射获取字段上swagger注解,再获取对应注解字段中文描述,如果不想用swagger也可以自定义注解,添加中文名,然后再获取对应注解字段中文名
该文章介绍了一个Java工具类,用于比较前端页面提交的TestBean与数据库中存储的TestBean实体对象的字段值变化,通过反射和Swagger注解获取字段信息,生成包含字段中文名和变动前后值的日志。

334

被折叠的 条评论
为什么被折叠?



