2017-11-01 1 views
0

mapstruct를 사용하여 반복 불가능한 값 즉 문자열을 문자열 목록에 매핑하려고합니다. 여기 abc 그래서 내가 사용하고mapstruct에서 iterable로 반복 가능하지 않음의 맵핑

@Mapping(target = "abc", expression = "java(java.util.Arrays.asList(x.getY().getXyz()))") 

List<String>

xyzString

이다 그러나 i에 명시 적으로 null를 확인하기 위해 필요하다.

비 반복 가능을 반복 가능으로 변환하여 반복 불가능한 반복 가능을 만드는 더 좋은 방법이 있습니까?

답변

1

을 가지고 @Qualifier을 사용할 수있는 것은 대한 예입니다 비 반복 가능한 - 투 - 반복 가능한 :

public class Source { 

    private String myString; 

    public String getMyString() { 
     return myString; 
    } 

    public void setMyString(String myString) { 
     this.myString = myString; 
    } 

} 

public class Target { 

    private List<String> myStrings; 

    public List<String> getMyStrings() { 
     return myStrings; 
    } 

    public void setMyStrings(List<String> myStrings) { 
     this.myStrings = myStrings; 
    } 

} 

@Qualifier 
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.SOURCE) 
public @interface FirstElement { 
} 

public class NonIterableToIterableUtils { 

    @FirstElement 
     public List<String> first(String in) { 
      if (StringUtils.isNotEmpty(in)) { 
       return Arrays.asList(in); 

      } else { 
       return null; 
      } 
     } 

} 

@Mapper(uses = NonIterableToIterableUtils.class) 
public interface SourceTargetMapper { 

    SourceTargetMapper MAPPER = Mappers.getMapper(SourceTargetMapper.class); 

    @Mappings({ 
     @Mapping(source = "myString", target = "myStrings", qualifiedBy = FirstElement.class) 
    }) 
    Target toTarget(Source s); 
} 

public class Main { 

    public static void main(String[] args) { 
     Source s = new Source(); 
     s.setMyString("Item"); 

     Target t = SourceTargetMapper.MAPPER.toTarget(s); 
     System.out.println(t.getMyStrings().get(0)); 

    } 

} 
0

MapStruct 예제 저장소에 iterable-to-non-iterable 예제가 있습니다. 추가로 non-iterable-to-iterable에 대한 보류중인 끌어 오기 요청이 있습니다.

요약하면 매핑을 수행 할 사용자 지정 방법을 사용할 수 있습니다. 또한 더 granural 제어 여기