Copiez des champs spécifiques à L'aide de BeanUtils.copyProperties?

springframework.beans.BeanUtils est très utile pour copier des objets, et j'utilise fréquemment l'option "ignorepropriétés". Cependant, parfois je veux copier uniquement des objets spécifiques (fondamentalement, le contraire de "ignorer les propriétés"). Quelqu'un sait-il comment je peux faire cela? Toute aide sera appréciée.

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;
    }    
}
32
demandé sur Donut 2011-02-22 17:34:59

5 réponses

Vous pouvez utiliser le BeanWrapper de la technologie. Voici un exemple d'implémentation:

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

}

Ou, si vous avez vraiment, vraiment voulez utiliser BeanUtils, voici une solution. Inversez la logique, rassemblez les exclusions en comparant la liste complète des propriétés avec les 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);
}
55
répondu Sean Patrick Floyd 2018-03-28 16:03:37

Si vous ne voulez pas utiliser Commons BeanUtils, vous pouvez toujours utiliser Spring en utilisant leBeanWrapper .

Vous devrez parcourir manuellement toutes les propriétés afin de créer une méthode d'aide statique.

Vous pouvez toujours simplement copier ce que fait copyProperties et vous adapter à votre goût: http://tinyurl.com/BeanUtils-copyProperties

3
répondu Adam Gent 2011-02-22 15:20:58

Vérifiez ceci: BeanPropertyCopyUtil .

Exemple:

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

Vous aurez également besoin D'Apache Commons BeanUtils.

2
répondu eolith 2011-02-22 15:01:21

Voici un exemple avec la classe 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
répondu ingchristianreyes 2014-05-19 22:49:17

Vous pouvez utiliser org.springframework.haricot.BeanUtils.copyProperties (Source D'objet, cible D'objet, classe modifiable) lance BeansException

Assurez-vous que la cible implémente l'interface modifiable qui définit les propriétés qui seront copiées.

0
répondu Gautam Pal 2015-06-15 07:16:57