修改前修改后

文章介绍了如何通过创建自定义注解@ForUpdate来标记需要对比的字段,然后利用工具类BeanUtil获取并对比两个对象中这些字段的变化。在对比过程中,如果字段值未发生变化,则在结果对象中设为空。最后,通过示例展示了如何获取和使用对比后的ObjectContrastBO对象。
摘要由CSDN通过智能技术生成

1.自定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ForUpdate {
    String fieldName() default "";
}

2.给需要对比的字段加上注解

	@Data
    @Builder
    public class CompareRes {
   
        private Long id; //不需要记录变化的字段,无需添加注解 @ForUpdate
       
        @ForUpdate(fieldName = "姓名") //需要记录变化的字段,需添加注解@ForUpdate
        private String name;

        @ForUpdate(fieldName = "年龄")
        private Integer age;
    }

3.创建对比后放入的对象

/**
 * 对象对比
 * @param <T>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ObjectContrastBO<T> {
    /**
     * 修改前对象
     */
    private T beforeObject;
    /**
     * 修改后对象
     */
    private T afterObject;
}

4.添加对比工具类

public class BeanUtil {
    /**
     * 获取变更前内容和变更后内容
     * @param oldBean 更改前的Bean
     * @param newBean 更改后的Bean
     * @param <T>
     * @return
     */
    public static <T> ObjectContrastBO getChangedFields(T oldBean, T newBean){
        Field[] fields = newBean.getClass().getDeclaredFields();
        ObjectContrastBO objectContrastBO = new ObjectContrastBO<>();
        for(Field field : fields) {
            field.setAccessible(true);
            if (!field.isAnnotationPresent(ForUpdate.class)) {
                continue;
            }
            try {
                Object oldValue = field.get(oldBean);
                Object newValue = field.get(newBean);
                if(Objects.equals(newValue, oldValue)) {
                    field.set(newBean, null);
                    field.set(oldBean, null);
                }
            } catch (Exception e) {
                throw new RuntimeException("比较修改前后数据出错");
            }
        }
        objectContrastBO.setBeforeObject(oldBean);
        objectContrastBO.setAfterObject(newBean);
        return objectContrastBO;
    }
}

field.getAnnotation(ForUpdate.class).fieldName(); //获取字段名称

5.获取对比的对象

CompareRes beforeCompare = convertCompareRes(beanA);//转换对象
CompareRes afterCompare = convertCompareRes(beanB);
ObjectContrastBO<CompareRes> objectContrastBO = BeanUtil.getChangedFields(beforeCompare,afterCompare);

获取对比后的数据,相同的字段返回值为空,前端判断后展示非空

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值