Подтвердить что ты не робот

Скопировать определенные поля с помощью 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;
    }    
}
4b9b3361

Ответ 1

Вы можете использовать технологию 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)));

}

Или, если вы действительно хотите использовать BeanUtils, вот решение. Инвертируйте логику, собирайте исключение, сравнивая полный список свойств с включением:

public static void copyProperties2(Object src, Object trg, Set<String> props) {
    String[] filteredPropertyNames = 
            Arrays.stream(BeanUtils.getPropertyDescriptors(src.getClass()))
                  .map(PropertyDescriptor::getName)
                  .filter(props::contains)
                  .toArray(String[]::new);

    BeanUtils.copyProperties(src, trg, filteredPropertyNames);
}

Ответ 2

Если вы не хотите использовать Commons BeanUtils, вы можете использовать Spring, используя BeanWrapper.

Вам нужно будет вручную выполнить все свойства, чтобы вы захотели создать статический вспомогательный метод.

Вы всегда можете просто скопировать то, что делает copyProperties, и настроить его по своему вкусу: http://tinyurl.com/BeanUtils-copyProperties

Ответ 3

Отметьте это: BeanPropertyCopyUtil.

Пример:

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

Вам также понадобится Apache Commons BeanUtils.

Ответ 4

Вот пример с Spring BeanUtils class:

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

Ответ 5

Вы можете использовать   org.springframework.beans.BeanUtils.copyProperties(источник объекта, объект-объект, редактируемый класс) бросает BeansException

Убедитесь, что цель реализует редактируемый интерфейс, который определяет свойства, которые будут скопированы.