自定义注解比较对象

对象比较后发生变化才更新
需求,用户点击编辑弹框后直接点击【确定】按钮数据也更新了
解决方法:
①前端做监听,字段发生修改则调用更新接口
②第一种方式不靠谱,后端不应该充分相信传入接口的参数,任何情况下后端都应该充分校验
所以需要先对传入的参数进行格式校验,然后查表看是否字段也发生变化
比较两个对象多个字段是否变化的最优方式如下:

1、自定义注解CompareField

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CompareField {
    String value() default "";

    /**
     * 分组码值
     *
     * @return
     */
    String groupCode();
}

2、编写对象比较器 ObjectComparator

public class ObjectComparator {
    public static boolean compare(Object oldObj, Object newObj, String groupCode) {
        try {
            // 获取所有字段
            Field[] fields = oldObj.getClass().getDeclaredFields();
            // 遍历所有字段
            for (Field field : fields) {
                // 如果字段被 @CompareField 注解标注且当前分组
                CompareField annotation = field.getAnnotation(CompareField.class);
                if (field.isAnnotationPresent(CompareField.class) && annotation.groupCode().contains(groupCode)) {
                    // 设置字段可访问
                    field.setAccessible(true);
                    // 获取字段的旧值和新值
                    Object oldValue = field.get(oldObj);
                    Object newValue = field.get(newObj);
                    if (ObjectUtils.compare((Comparable) oldValue, (Comparable) newValue) != 0) {
                        return false;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}

3、比较工具做好了,下面这样用,在需要比较的类对象字段添加注解@CompareField ;之所以要加groupCode的原因是可能这个类字段在其他业务模块也需要比较

@Data
@EqualsAndHashCode
@TableName("pay_record")
public class PayRecordPO extends BasePO {

    /**
     * 所属模块名:1-债券,2-存单,3-资金
     */
    private Integer moduleType;

    /**
     * 所属补录、订单id
     */
    private Long orderId;

    /**
     * 付款方id
     */
    @CompareField(groupCode = "payment")
    private Long payerId;

    /**
     * 付款方
     */
    @CompareField(groupCode = "payment")
    private String payerName;

    /**
     * 回款金额
     */
    @CompareField(groupCode = "payment")
    private BigDecimal paymentAmount;

    /**
     * 缴款日
     */
    @CompareField(groupCode = "payment")
    private LocalDate paymentDate;

    /**
     * 付款方式
     */
    @CompareField(groupCode = "payment")
    private Integer paymentType;

    /**
     * 付款凭证url
     */
    @CompareField(groupCode = "payment")
    private String paymentCertificateUrl;

}

4、使用

ObjectComparator.compare(recordPO, updateRecord, "payment")//recordPO原来对象,updateRecord新对象,"payment" 当前业务字段分组码值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值