2017-11-30 2 views
0

MapStruct를 사용하여 두 객체를 매핑하려고합니다. 나는 잠시 동안 검색을 해왔으며 아무것도 찾을 수 없었습니다. 프로그래밍에 익숙하지 않아서 제작하는 것보다 쉽습니다. 여기 MapStruct arrayList에서 가져 오는 중

약간 뒤로 벗겨 코드는 (그것이 여기로 실제 코드 ArrayList를 수신처로 동일한 유형 없다는로부터 자식 오브젝트로 더욱 복잡 유의 아이 변수 개체)

SourceObject을

public class SourceObject { 
    public ArrayList<ListObject> list = new ArrayList<ListObject>(); 

    public SourceObject() { 
     list.add(new ListObject()); 
    } 
} 

ListObject

public class ListObject { 
    public DetailsObject details = new DetailsObject(); 

    public ListObject() { 
     details.forename="SourceForename"; 
     details.surname="SourceSurname"; 
    } 
} 

DestinationObject

public class DestinationObject { 
    public DetailsObject details = new DetailsObject(); 

    public DestinationObject() { 
     details.forename="DestinationForename"; 
     details.surname="DestinationSurname"; 
    } 
} 

DetailsObject

public class DetailsObject { 
    public String forename; 
    public String surname; 
} 

이것은 내가 직접 SourceObject 내부 DetailsObject를 넣으면 잘 작동하지만, 내가하려고 할 때 문제가된다 할 것이다

@Mappings({ 
    @Mapping(target="details.forename", source="list.get(0).details.forename"), 
    @Mapping(target="details.surname", source="list.get(0).details.surname"), 
}) 
DestinationObject toDestination(SourceObject source); 

매퍼 그것을 t에서 가져 가라. 그는 목록에 올라있다. 내가 얻은 오류는 다음과 같습니다.

[오류] 목표 org.apache.maven.plugins : maven-compiler-plugin 실행 실패 : 3.5.1 : 프로젝트 템플릿에서 컴파일 (기본 컴파일) : 컴파일 실패 : 컴파일 실패 :

[ERROR] .../src/main/java/Mapper/SourceToDestinationMap.java : [12,13] source 매개 변수에는 "list.get (0) .details.surname"이라는 속성이 없습니다). "list.empty"?

[ERROR] .../src/main/java/Mapper/SourceToDestinationMap.java : [11,9] 소스 매개 변수에 "list.get (0) .details.forename" . "list.empty"?

편집 : 매퍼의 현재 상태 :

@Mapper 
public interface SourceToDestinationMap { 

    @Mapping(target = "details", source = "list") 
    DestinationObject toDestination(SourceObject source); 

    default DetailsObject map(List<ListObject> source) { 
     return map(source.get(0)); 
    } 

    DetailsObject map(ListObject source); 
} 
+1

완전한 매퍼 코드와받은 컴파일 오류를 제공하십시오. – saw303

+0

매핑 코드가 잘못되었거나 더 구체적으로 클래스 코드가 매핑하려는 코드와 일치하지 않습니다. – Filip

+0

미안하지만, 나는 누군가가 쉽게 arraylist에서 일반적인 작업을 기대하고 얻을 방법의 방향으로 나를 가리키길 바랄거야. 내 프로젝트에서 모든 세부 사항을 취하기보다는, 내가하려고하는 것을 보여주는 간단한 프로젝트를 만들었으며 이것을 반영하기 위해 첫 번째 게시물을 업데이트했습니다. 잘하면 그게 도움이 :) –

답변

0

당신이하려고하는 매핑 할 수없는, 당신은 콩의 특성과 콩의 기능을 혼합한다.

@Mapping(source = "list.get(0).XXX")을 사용할 수 없습니다. 색인을 사용하여 목록의 요소에 액세스하는 것은 아직 지원되지 않습니다. #1321을 참조하십시오.

문제를 해결하는 방법은 mapstruct-iterable-to-non-iterable 예제에서 사용되는 것과 동일한 방법으로 한정자를 사용하는 것입니다.

또는 매핑을 수행 할 고유 한 방법을 제공 할 수 있습니다.

@Mapper 
pubic interface MyMapper { 

    @Mapping(target = "details", source = "list") 
    DestinationObject toDestination(SourceObject source); 

    default DetailsObject map(List<ListObject> source) { 
     return source != null && !source.isEmpty() ? map(source.get(0)) : null; 
    } 

    DetailsObject map(ListObject source); 
} 

MapStruct가 올바른 코드를 생성합니다.

또 다른 대안은 @Mapping(expression="java()"을 사용하는 것입니다.expression에 대한

@Mapper 
public interface MyMapper { 

    @Mapping(target = "details.forename", expression = "java(source.list.get(0).details.forename)") 
    @Mapping(target = "details.surname", expression = "java(source.list.get(0).details.surname)") 
    DestinationObject toDestination(SourceObject source); 
} 

참고 :

귀하의 매퍼는 다음과 같이 표시됩니다. MapStruct는 표현식의 텍스트를있는 그대로 사용하며 유효성 검사를 수행하지 않습니다. 따라서 null이없고 빈 검사가 없으므로 조금 부서지기 쉽습니다.

+0

지금까지 도와 줘서 고마워! 내 자신의 방법을 제공하는 것이 가장 좋은 방법입니다. 줄에 문제가 있습니다. return source! = null &&! source.isEmpty() : map (source.get (0)) : null; 다음과 같이 : 구문 오류가 발생합니다. 왜이게 될지 아십니까? –

+0

구문 오류가 있습니다. ':'는'?'이어야합니다. 적합하다고 생각되는 방식으로 구현할 수도 있습니다. 이것은 단지 예일뿐입니다. – Filip

+0

고맙습니다. 이전에 Java에서 삼항 식을 보지 못했습니다. 내 코드를 간단하게 유지하기 위해 반환 맵 (source.get (0))을 사용하려고합니다. 지금은 유효성 검사를 나중에 추가 할 수 있습니다. 이제는 컴파일이되었지만 예상 된 tmpForename보다는 매핑 후에 dest.details.forename 변수에 null이 저장되고 성 변수에도 같은 값이 저장되므로 테스트가 실패합니다. –

관련 문제