内容差异比较工具类

内容差异比较工具类

比较两个对象是否存在差异

实际需求:

同步数据时,比较与数据库中的数据是否存在差异

内容差异比较器工具类

import lombok.extern.slf4j.Slf4j;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;

/**
 * 内容差异比较器
 *
 * @author lyn
 * @date 2022/7/25 11:30
 */
@Slf4j
public class ContextDifferenceUtil {

    /**
     * 比较两个对象是否存在差异
     *
     * @param oldObj
     * @param newObj
     * @param clazz
     * @return
     */
    public static boolean contrasObj(Object oldObj, Object newObj, Class clazz) {
        if (Objects.isNull(oldObj)) {
            return true;
        }
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            //对字段上有IgnoreField注解的忽略比较
            if (field.isAnnotationPresent(IgnoreField.class)) {
                continue;
            }
            try {
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), clazz);
                Method getMethod = propertyDescriptor.getReadMethod();
                //取出新老字段的值去比较,
                Object v1 = getMethod.invoke(oldObj);
                Object v2 = getMethod.invoke(newObj);
                if (v1 != null && v2 != null && (!v1.toString().equals(v2.toString()))) {
                    return true;
                }
                // TODO: 2022/7/25 不完善 ,需根据实际情况修改
                //如果oldObj是数据库中查出的对象时,需要排除默认值的干扰
                if (v1 != null && (!"".equals(v1.toString())) && v2 == null) {
                    return true;
                }
                if (v1 == null && v2 != null && (!"".equals(v2.toString()))) {
                    return true;
                }
            } catch (Exception e) {
                log.error("ContextDifferenceUtil-error: "+e.getMessage());
            }
        }
        return false;
    }
}

忽略字段注解

/**
 * 忽略字段注解
 *
 * @author lyn
 * @date 2022/7/25 11:36
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreField {
}

异常问题解决

执行到这里时抛出异常:java.beans.IntrospectionException: Method not found: isSerialVersionUID

image-20220725142406697

解决方案:去掉该字段或者在该字段上加@IgnoreField(忽略字段注解)

image-20220725140414828

posted @ 2022-07-25 14:29  进击的小蔡鸟  阅读(255)  评论(0编辑  收藏  举报