복붙노트

[SPRING] BeanUtils.copyProperties를 사용하여 특정 필드를 복사 하시겠습니까?

SPRING

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

해결법

  1. ==============================

    1.BeanWrapper 기술을 사용할 수 있습니다. 다음은 구현 예입니다.

    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를 정말로 사용하고 싶다면 여기 해결책이 있습니다. 논리를 뒤집고 전체 속성 목록을 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);
    }
    
  2. ==============================

    2.Commons BeanUtils를 사용하지 않으려면 BeanWrapper를 사용하여 Spring을 계속 사용할 수 있습니다.

    Commons BeanUtils를 사용하지 않으려면 BeanWrapper를 사용하여 Spring을 계속 사용할 수 있습니다.

    모든 속성을 수동으로 반복해야하므로 정적 도우미 메서드를 만들려고합니다.

    당신은 언제나 copyProperties가하고있는 일을 복사해서 원하는대로 조정할 수 있습니다 : http://tinyurl.com/BeanUtils-copyProperties

  3. ==============================

    3.이것을 확인하십시오 : BeanPropertyCopyUtil.

    이것을 확인하십시오 : BeanPropertyCopyUtil.

    예:

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

    또한 Apache Commons BeanUtils가 필요합니다.

  4. ==============================

    4.다음은 Spring BeanUtils 클래스의 예제입니다.

    다음은 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();
        }
    }
    
  5. ==============================

    5.너는 사용할 수있다.     org.springframework.beans.BeanUtils.copyProperties (Object source, Object target, Class editable)는 BeansException를 슬로우합니다.

    너는 사용할 수있다.     org.springframework.beans.BeanUtils.copyProperties (Object source, Object target, Class editable)는 BeansException를 슬로우합니다.

    타겟이 복사 할 속성을 정의하는 편집 가능한 인터페이스를 구현하는지 확인합니다.

  6. from https://stackoverflow.com/questions/5079458/copy-specific-fields-by-using-beanutils-copyproperties by cc-by-sa and MIT license