spring BeanUtils.copyProperties不copy null
时间: 2023-05-18 16:05:23 浏览: 186
在使用Spring的BeanUtils.copyProperties方法时,如果源对象的属性值为null,则不会复制到目标对象中。这是因为BeanUtils.copyProperties方法默认情况下会忽略源对象中的null值属性。
如果需要复制源对象中的null值属性,可以使用BeanUtils.copyProperties方法的第三个参数,即忽略属性列表。将需要忽略的属性名添加到忽略属性列表中即可。
示例代码:
```
BeanUtils.copyProperties(source, target, "ignoreProperty1", "ignoreProperty2");
```
在上述示例中,忽略属性列表中的属性名将不会被复制到目标对象中,即使源对象中的属性值为null。
相关问题
BeanUtils.copyProperties处理null
### BeanUtils.copyProperties 方法处理 null 值
当使用 `BeanUtils.copyProperties` 复制对象属性时,可以通过设置第三个参数来控制是否忽略源对象中的 null 属性值。具体来说:
- 如果希望在复制过程中跳过源对象中为 null 的属性,可以将第三参数设为 true。
- 如果希望即使源对象中有 null 值也进行赋值操作,则应将此参数设为 false。
下面是一个具体的代码示例展示如何实现这一点[^1]:
```java
import org.springframework.beans.BeanUtils;
public class PropertyCopyExample {
public static void main(String[] args) {
Source source = new Source();
Target target = new Target();
// 设置 ignoreNull 为 true 表示忽略源对象中的 null 属性
boolean ignoreNull = true;
try {
BeanUtils.copyProperties(source, target, ignoreNull);
} catch (Exception e) {
System.out.println("Property copy failed.");
}
}
private static class Source {
private String name;
// getter and setter methods...
}
private static class Target {
private String name;
// getter and setter methods...
}
}
```
通过这种方式可以在调用 `copyProperties` 方法时灵活决定对待 null 属性的态度,从而更好地满足实际需求。
BeanUtils.copyProperties忽略null值
可以使用BeanMapper或者在BeanUtils.copyProperties中传入一个自定义的属性过滤器来忽略null值。以下是两种方法的示例代码:
1. 使用BeanMapper忽略null值
```python
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.core.Converter;
public class BeanMapper {
private static final Map<String, BeanCopier> BEAN_COPIERS = new ConcurrentHashMap<>();
public static void copyProperties(Object source, Object target) {
String key = source.getClass().toString() + target.getClass().toString();
BeanCopier copier = null;
if (!BEAN_COPIERS.containsKey(key)) {
copier = BeanCopier.create(source.getClass(), target.getClass(), true);
BEAN_COPIERS.put(key, copier);
} else {
copier = BEAN_COPIERS.get(key);
}
copier.copy(source, target, new Converter() {
@Override
public Object convert(Object value, Class target, Object context) {
if (value == null) {
if (target == String.class) {
return "";
} else if (target == Integer.class) {
return 0;
} else if (target == Long.class) {
return 0L;
} else if (target == Double.class) {
return 0.0;
} else if (target == Float.class) {
return 0.0f;
} else if (target == Boolean.class) {
return false;
} else {
return null;
}
} else {
return value;
}
}
});
}
}
```
使用示例:
```python
Source source = new Source();
source.setName("test");
source.setAge(18);
source.setAddress(null);
Target target = new Target();
BeanMapper.copyProperties(source, target);
System.out.println(target.getName()); // 输出:test
System.out.println(target.getAge()); // 输出:18
System.out.println(target.getAddress()); // 输出:null
```
2. 在BeanUtils.copyProperties中传入自定义属性过滤器忽略null值
```python
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyDescriptor;
import java.util.HashSet;
import java.util.Set;
public class CopyUtils {
public static void copyPropertiesIgnoreNull(Object source, Object target) {
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
}
private static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (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);
}
}
```
使用示例:
```python
Source source = new Source();
source.setName("test");
source.setAge(18);
source.setAddress(null);
Target target = new Target();
CopyUtils.copyPropertiesIgnoreNull(source, target);
System.out.println(target.getName()); // 输出:test
System.out.println(target.getAge()); // 输出:18
System.out.println(target.getAddress()); // 输出:null
```
阅读全文