1. 程式人生 > >Spring的BeanUtils.copyProperties()在複製屬性時忽略null值和empty集合

Spring的BeanUtils.copyProperties()在複製屬性時忽略null值和empty集合

       今天在寫專案介面的時候需要把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);
    }