web-dev-qa-db-ja.com

BeanUtils.copyPropertiesを使用して特定のフィールドをコピーしますか?

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;
    }    
}
33
zono

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);
}
58

Commons BeanUtilsを使用したくない場合でも、 BeanWrapper を使用してSpringを使用できます。

すべてのプロパティを手動でループする必要があるため、静的ヘルパーメソッドを作成する必要があります。

CopyPropertiesが実行していることをいつでもコピーして、好みに合わせて調整できます。 http://tinyurl.com/BeanUtils-copyProperties

3
Adam Gent

これを確認してください: BeanPropertyCopyUtil

例:

copyProperties(user, systemUser, "first firstName", "last lastName");

また、Apache Commons BeanUtilsも必要です。

2
eolith

Org.springframework.beans.BeanUtils.copyProperties(Object source、Object target、Class editable)throws BeansExceptionを使用できます

ターゲットがコピー可能なプロパティを定義する編集可能なインターフェイスを実装していることを確認してください。

0
Gautam Pal

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();
    }
}
0