Bean对象比较字段值差异并打印完整字段信息

该文章介绍了一个Java工具类,用于比较前端页面提交的TestBean与数据库中存储的TestBean实体对象的字段值变化,通过反射和Swagger注解获取字段信息,生成包含字段中文名和变动前后值的日志。

需求:实现前端页面修改提交的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也可以自定义注解,添加中文名,然后再获取对应注解字段中文名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值