经常使用 Spring 提供的 BeanUtils.copyProperties 来对 DO 和 DTO 等实体之间的转换,但是后面遇到一个开发问题,如果我的 source 中某个字段为空,我不希望它覆盖掉 target 中的这个字段,因为这个 target 可能本来是有值的。
如果不作处理,就会很容易抛空指针,而且导致业务失败。
所以可以定义以下方法,搭配 BeanUtils.copyProperties 使用
/**
* 配合 BeanUtils.copyProperties 防止 source 的 null值覆盖 target 的值
*
* @param source 来源类
* @return 值为 null 的字段们
*/
private String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<String>();
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);
}
使用举例:
BeanUtils.copyProperties(request, response, getNullPropertyNames(request));
- 直接加在 target 后面就可以了,这是 copyProperties 的另一种重载方式。