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