内容差异比较工具类
作者:互联网
目录
内容差异比较工具类
比较两个对象是否存在差异
实际需求:
同步数据时,比较与数据库中的数据是否存在差异
内容差异比较器工具类
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
解决方案:
去掉该字段或者在该字段上加@IgnoreField(忽略字段注解)
标签:return,差异,v1,v2,内容,&&,import,工具,null 来源: https://www.cnblogs.com/lyn8100/p/16517265.html