springframework.beans.BeanUtils
はオブジェクトをコピーするのに非常に便利で、「ignoreProperties」オプションを頻繁に使用します。ただし、特定のオブジェクト(基本的に、「プロパティを無視」の反対)のみをコピーしたい場合があります。誰も私がそれを行う方法を知っていますか?任意の助けをいただければ幸いです。
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;
}
}
BeanWrapper
テクノロジーを使用できます。実装例を次に示します。
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)));
}
または、本当に、reallyBeanUtils
を使用したい場合、ここに解決策があります。ロジックを反転し、完全なプロパティリストとインクルードを比較して除外を収集します。
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);
}
Commons BeanUtilsを使用したくない場合でも、 BeanWrapper を使用してSpringを使用できます。
すべてのプロパティを手動でループする必要があるため、静的ヘルパーメソッドを作成する必要があります。
CopyPropertiesが実行していることをいつでもコピーして、好みに合わせて調整できます。 http://tinyurl.com/BeanUtils-copyProperties
これを確認してください: BeanPropertyCopyUtil 。
例:
copyProperties(user, systemUser, "first firstName", "last lastName");
また、Apache Commons BeanUtilsも必要です。
Org.springframework.beans.BeanUtils.copyProperties(Object source、Object target、Class editable)throws BeansExceptionを使用できます
ターゲットがコピー可能なプロパティを定義する編集可能なインターフェイスを実装していることを確認してください。
Spring BeanUtilsクラスの例を次に示します。
public static void copyList(List sourceList,
List targetList, Class targetType) {
try {
for (Object source : sourceList) {
Object target = null;
target = targetType.newInstance();
BeanUtils.copyProperties(source, target);
targetList.add(target);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}