扩展spring的BeanUtils,增加拷贝属性排除null值的功能(注:String为null不考虑)

public class BeanUtils extends org.springframework.beans.BeanUtils {


public static void copyNotNullProperties(Object source, Object target, String[] ignoreProperties) throws BeansException {
copyNotNullProperties(source, target, null, ignoreProperties);
}


public static void copyNotNullProperties(Object source, Object target, Class<?> editable) throws BeansException {
copyNotNullProperties(source, target, editable, null);
}


public static void copyNotNullProperties(Object source, Object target) throws BeansException {
copyNotNullProperties(source, target, null, null);
}


private static void copyNotNullProperties(Object source, Object target, Class<?> editable, String[] ignoreProperties) throws BeansException {


Assert.notNull(source, "Source must not be null");
Assert.notNull(target, "Target must not be null");


Class<?> actualEditable = target.getClass();
if (editable != null) {
if (!editable.isInstance(target)) {
throw new IllegalArgumentException("Target class [" + target.getClass().getName() + "] not assignable to Editable class [" + editable.getName() + "]");
}
actualEditable = editable;
}
PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
List<String> ignoreList = (ignoreProperties != null) ? Arrays.asList(ignoreProperties) : null;


for (PropertyDescriptor targetPd : targetPds) {
if (targetPd.getWriteMethod() != null && (ignoreProperties == null || (!ignoreList.contains(targetPd.getName())))) {
PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
if (sourcePd != null && sourcePd.getReadMethod() != null) {
try {
Method readMethod = sourcePd.getReadMethod();
if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
readMethod.setAccessible(true);
}
Object value = readMethod.invoke(source);
if (value != null || readMethod.getReturnType().getName().equals("java.lang.String")) {// 这里判断以下value是否为空,当然这里也能进行一些特殊要求的处理 例如绑定时格式转换等等,如果是String类型,则不需要验证是否为空
boolean isEmpty = false;
if (value instanceof Set) {
Set s = (Set) value;
if (s == null || s.isEmpty()) {
isEmpty = true;
}
} else if (value instanceof Map) {
Map m = (Map) value;
if (m == null || m.isEmpty()) {
isEmpty = true;
}
} else if (value instanceof List) {
List l = (List) value;
if (l == null || l.size() < 1) {
isEmpty = true;
}
} else if (value instanceof Collection) {
Collection c = (Collection) value;
if (c == null || c.size() < 1) {
isEmpty = true;
}
}
if (!isEmpty) {
Method writeMethod = targetPd.getWriteMethod();
if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
writeMethod.setAccessible(true);
}
writeMethod.invoke(target, value);
}
}
} catch (Throwable ex) {
throw new FatalBeanException("Could not copy properties from source to target", ex);
}
}
}
}
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值