2017-09-19 2 views
0

,이 (? 우연에 의해) mapDetails 방법은 이후MapStruct : 입력 개체를 표현식에 전달하는 방법은 무엇입니까? MapStruct 버전 1.1.0.Final에서

@Mappings({ 
    @Mapping(target = "transaction.process.details", expression = "java(MappingHelper.mapDetails(request))"), 
    //more mappings 
}) 
Response requestToResponse(Request request); 

그것은 가능했다 .... 수 있었던 requestToResponse 방법으로 생성. 그래서 request이 null이 아닙니다.

이제 1.1.0.Final이 Lombok과 호환되지 않아서 1.2.0.CR2로 업그레이드해야했습니다. 이 버전에서는 mapDetailsrequest이 전달되지 않는 별도의 메소드로 생성되므로 request이이 메소드에서 null이며이 표현식과 함께 NPE를 얻습니다. (하위 하위 메서드는 requestToResponse입니다.)

표현을 잘못 사용 했나요? 우연히 만 작동 했나요? 아니면 새 버전에 버그가 있습니까? 버그가 없으면 request 인스턴스를 표현식에 제대로 전달해야합니까?

답변

2

표현을 잘못 사용하고 있습니다. 목표를 소스 매개 변수에 맵핑하면됩니다.

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request"), 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 

MapStruct 그 중개 방법을 만들고 MappingHelper을 사용하고 mapDetails 메소드를 호출한다. 많은 메소드가 Request에서 details 유형으로 매핑되는 경우 정규화 된 매핑을 사용해야합니다 (문서에서 here 참조).

그것은 같은 모양 :

public class MappingHelper { 
    @Named("mapDetails") // or the better type safe one with the meta annotation @Qualifier 
    public static String mapDetails(Request request); 
} 

을 그리고 당신의 매핑은 다음과 같이 표시됩니다

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request", qualifiedByName = "mapDetails"), //or better with the meta annotation @Qualifier qualifiedBy 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 
+0

감사합니다, 다시 작동합니다 :) – Bevor

+0

당신이 좋은 테스트, 중첩 된 대상의 속성을 가지고 있는지 확인 1.2.0에서 향상되었고 제대로 작동하지 않는 경우가있었습니다 (이전에는 버그가있었습니다) – Filip