BeanUtils.copyBeanProperties()对象的属性复制且忽略null值

封装的方法:

public static String[] getNullPropertyNames(Object source) {final BeanWrapper src = new BeanWrapperImpl(source);java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();Set emptyNames = new HashSet();for (java.beans.PropertyDescriptor pd : pds) {Object srcValue = src.getPropertyValue(pd.getName());if (srcValue == null) {emptyNames.add(pd.getName());}}String[] result = new String[emptyNames.size()];return emptyNames.toArray(result);
}

把一个对象的属性赋值给另一个对象且忽略null值(属性名要相同)_yedong_的博客-CSDN博客_将一个对象的属性值赋值给另一个对象


  • 最近在设计通用的 Service 和 Controller 层
  • 设计过程中涉及到实体对象(JPA)的更新操作
  • 原因1:JPA 的 saveAndFlush 方法会将把 null 也更新上去
  • 原因2:spring 的 BeanUtils.copyBeanProperties 方法会把 src 所有属性值包括 null 覆盖到 dest,不符合要求
  • 所以,利用反射,写一个属性复制方法代替 spring 的工具方法
  • 另外,controller 层使用 @ModelAttribut 也可以解决这个问题,这就是另一个主题
/*** 对象属性值拷贝,null 值覆盖修复版* @param beanSrc* @param beanDest*/
public static void copyBeanPropertiesIgoreNull(Object beanSrc, Object beanDest){Class clazzSrc = beanSrc.getClass();Class clazzDest = beanDest.getClass();//获取所有属性,包括私有的和继承的List allFields = getAllFields(beanSrc);try {for(Field field:allFields) {String fieldName = field.getName(); //属性名if("serialVersionUID".equals(fieldName)) {continue;}PropertyDescriptor pd1 = getPropertyDescriptor(fieldName, clazzSrc);if(pd1!=null) {Method rMethod = pd1.getReadMethod();if(rMethod!=null) {Object fieldValue = rMethod.invoke(beanSrc); //属性值,引用类型,所以一般实体的属性用 Integer instead of intif(fieldValue!=null) { //关键:属性值为 null 就不要覆盖了PropertyDescriptor pd2 = getPropertyDescriptor(fieldName, clazzDest);if(pd2!=null) {Method wMethod = pd2.getWriteMethod();if(wMethod!=null) {wMethod.invoke(beanDest, fieldValue);}}}}}}} catch (IllegalAccessException | InvocationTargetException e) {e.printStackTrace();throw new RuntimeException(">> copyPropertiesIgoreNull exception", e);}
}

 res:bean属性复制避免null值覆盖版本 - summaster - 博客园

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部