Spring的BeanUtils.copyProperties()在複製屬性時忽略null值和empty集合
阿新 • • 發佈:2018-12-10
今天在寫專案介面的時候需要把DTO類中的值更新到Bean中,發現DTO類中有一個集合屬性children的大小是0,而我從資料庫中查詢出來的Bean,children屬性是有值的。使用的是Spring提供的複製方法BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties),第三個引數用的方法是上文連結的方法。這個方法在我這個需求裡有一個問題,DTO類中的值覆蓋更新到Bean的話,將會覆蓋Bean中的集合屬性變為empty,這可就出大事了……因此我擴充套件了這個方法,需要忽略null值和empty集合,這樣DTO類覆蓋更新Bean就正常了。
public static String[] getNoValuePropertyNames (Object source) { // assert CommonUtils.isNotNull(source) : "傳遞的引數物件不能為空"; // 禁止使用這種斷言 Assert.notNull(source, "傳遞的引數物件不能為空"); final BeanWrapper beanWrapper = new BeanWrapperImpl(source); PropertyDescriptor[] pds = beanWrapper.getPropertyDescriptors(); Set<String> noValuePropertySet = new HashSet<>(); Arrays.stream(pds).forEach(pd -> { Object propertyValue = beanWrapper.getPropertyValue(pd.getName()); if (CommonUtils.isNull(propertyValue)) { noValuePropertySet.add(pd.getName()); } else { if (Iterable.class.isAssignableFrom(propertyValue.getClass())) { Iterable iterable = (Iterable) propertyValue; Iterator iterator = iterable.iterator(); if (!iterator.hasNext()) noValuePropertySet.add(pd.getName()); } if (Map.class.isAssignableFrom(propertyValue.getClass())) { Map map = (Map) propertyValue; if (map.isEmpty()) noValuePropertySet.add(pd.getName()); } } }); String[] result = new String[noValuePropertySet.size()]; return noValuePropertySet.toArray(result); }