2013-02-07 1 views
2

XML을 JAXB pojos로 읽고 필드를 엔터티 pojos에 병합하려고합니다. 그러나 XML의 값이 null 인 경우 기존 값을 덮어 쓰지 않으려합니다 (즉, 값이 XML에 존재하지 않음). 그래서 지금과 같은 코드의 긴 세트가 :이, 추악한 잡음이와 수중 음파 탐지기는 복잡성을에 대해 비명필드를 복사하지만 null을 건너 뛰는 세련된 방법

 if (addressDetails.getNAME1() != null) { 
      org.setName1(addressDetails.getNAME1()); 
     } 
     if (addressDetails.getNAME2() != null) { 
      org.setName2(addressDetails.getNAME2()); 
     } 
     if (addressDetails.getNAME3() != null) { 
      org.setName3(addressDetails.getNAME3()); 
     } 

. 이 일에 대해 어떻게 생각하세요? 엔티티 클래스 (세부, 보일러)

내가 읽고없이 뭔가를 목표로하고 있습니다에

  • 래퍼 클래스를 반영하여 util을

    • (느린를 안전하게 입력하지) : 마음에 와서 것들 많은 여분의 코드.

  • +0

    'setIfNotNull'과 같은 유틸리티 메소드를 제공하면 자세한 표시를 줄일 수 있습니다. 그러면 재산을 두 배로 줄여 줄 것입니다. 이 특정 기능을 가진 클래스가 존재하는지는 모르지만 구아바, 아파치 커먼즈 또는 스프링의 BeanUtils에 뭔가있을 수 있습니다. 이 분야의 반복에 관해서는 반성이 유일한 길일 것입니다. BeanUtils도 여기에서 도움이 될 수 있습니다. 'copyProperties'는 비슷하지만 null 검사를하지 않습니다. – toniedzwiedz

    +0

    * 기존 * 객체를 덮어 쓰려면 비 정렬 화를 작성하십시오. 그것은 최적 일 것입니다. –

    +0

    @JoopEggen 좀 더 구체적 일 수 있습니까? – vertti

    답변

    1

    Google의 Guava 코드 라이브러리를 살펴보십시오. 널 (null)을 처리하기위한 유틸리티 메소드가 있습니다.

    +0

    사실 방금 방금 아이디어를 주셨습니다. 구아바의'firstNonNull (T t1, T t2)'와 비슷한 메소드를 사용하면'myEntity.setName (firstNonNull (jaxbPojo.getName(), myEntity.getName())'을 쓸 수 있습니다. 이것은 리플렉션보다 훨씬 덜 상세하고 훨씬 빠릅니다. – vertti

    +0

    이 방법을 사용하면 bean이 가지고있는 모든 프로퍼티를 코드화 할 수있다. (오른쪽) –

    +0

    예. 약간 지루한 경우 일반적으로 좋은 습관입니다. – KidTempo

    -1

    이 작업을 깔끔하게 처리 할 수있는 Reflection (ofcourse through BeanUils kind-of library)을 사용하는 것이 좋습니다.

    +0

    가능한 경우 반사가 피해야합니다. – KidTempo

    0

    여기에 따라 유연하면서도 느린 솔루션을 봄의 BeanUtils class

    PropertyDescriptor[] descriptors = getPropertyDescriptors(YourSourceClass.class); 
    List<String> ignoredProperties = new ArrayList<String>(); 
    for(PropertyDescriptor pd : descriptors){ 
        if(pd.getReadMethod().invoke(yourSourceObject) == null){ 
         ignoredProperties.add(pg.getBaseName()); 
        } 
    } 
    
    BeanUtils.copyProperties(yourSourceObject, yourTargetObject, ignoredProperties.toArray()); 
    

    그것은 않습니다 멀리 설정할 수있는 모든 필드에 대해 명시 적으로 널 (null) 검사, getter와 setter를 작성과 함께. 당신이 반사를 방지하려면

    ,이 구조 줄일 수 있습니다 : 구아바의 Objects.firstNonNull

    org.setName3(Objects.firstNonNull(addressDetails.getNAME3(), org.getName3())); 
    

    같은 유틸리티 방법을 사용하여

    if (addressDetails.getNAME3() != null) { 
         org.setName3(addressDetails.getNAME3()); 
    } 
    

    를 이것은 당신이 속성 당 한 줄을 쓰기 피할 도움이되지 않습니다 하지만 어쨌든 코드를 상당히 단축 할 것입니다.

    관련 문제