经常使用 Spring 提供的 BeanUtils.copyProperties 来对 DO 和 DTO 等实体之间的转换,但是后面遇到一个开发问题,如果我的 source 中某个字段为空,我不希望它覆盖掉 target 中的这个字段,因为这个 target 可能本来是有值的。

    如果不作处理,就会很容易抛空指针,而且导致业务失败。

    所以可以定义以下方法,搭配 BeanUtils.copyProperties 使用

    1. /**
    2. * 配合 BeanUtils.copyProperties 防止 source 的 null值覆盖 target 的值
    3. *
    4. * @param source 来源类
    5. * @return 值为 null 的字段们
    6. */
    7. private String[] getNullPropertyNames(Object source) {
    8. final BeanWrapper src = new BeanWrapperImpl(source);
    9. java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
    10. Set<String> emptyNames = new HashSet<String>();
    11. for (java.beans.PropertyDescriptor pd : pds) {
    12. Object srcValue = src.getPropertyValue(pd.getName());
    13. if (srcValue == null) {
    14. emptyNames.add(pd.getName());
    15. }
    16. }
    17. String[] result = new String[emptyNames.size()];
    18. return emptyNames.toArray(result);
    19. }

    使用举例:

    1. BeanUtils.copyProperties(request, response, getNullPropertyNames(request));
    • 直接加在 target 后面就可以了,这是 copyProperties 的另一种重载方式。