问题描述
springframework.beans.BeanUtils
对于复制对象非常有用,我经常使用ignoreProperties选项。但是,有时我只想复制特定对象(基本上与忽略属性相反)。有谁知道我该怎么做?任何帮助将不胜感激。
springframework.beans.BeanUtils
is very useful to copy objects, and I use the "ignoreProperties" option frequently. However, sometimes I want to copy only specific objects (basically, the opposite of "ignore Properties"). Does anyone know how can I do that? Any help will be appreciated.
import org.springframework.beans.BeanUtils;
public class Sample {
public static void main(String[] args) {
DemoADto demoADto = new DemoADto();
demoADto.setName("Name of Demo A");
demoADto.setAddress("Address of Demo A");
DemoBDto demoBDto = new DemoBDto();
// This is "ignoreProperties" option
// But I want to know how I can copy only name field by using BeanUtils or something.
BeanUtils.copyProperties(demoADto, demoBDto, new String[] {"address"});
System.out.println(demoBDto.getName());
System.out.println(demoBDto.getAddress());
}
}
public class DemoADto {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class DemoBDto {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
推荐答案
你可以使用技术。这是一个示例实现:
You can use the BeanWrapper
technology. Here's a sample implementation:
public static void copyProperties(Object src, Object trg, Iterable<String> props) {
BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(src);
BeanWrapper trgWrap = PropertyAccessorFactory.forBeanPropertyAccess(trg);
props.forEach(p -> trgWrap.setPropertyValue(p, srcWrap.getPropertyValue(p)));
}
或者,如果你真的,真的想要使用 BeanUtils
,这是一个解决方案。反转逻辑,通过比较完整属性列表和包含来收集排除:
Or, if you really, really want to use BeanUtils
, here's a solution. Invert the logic, gather excludes by comparing the full property list with the includes:
public static void copyProperties2(Object src, Object trg, Set<String> props) {
String[] excludedProperties =
Arrays.stream(BeanUtils.getPropertyDescriptors(src.getClass()))
.map(PropertyDescriptor::getName)
.filter(name -> !props.contains(name))
.toArray(String[]::new);
BeanUtils.copyProperties(src, trg, excludedProperties);
}
这篇关于使用BeanUtils.copyProperties复制特定字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!