2017-12-07 103 views
2

내 매핑 메서드에 3 개의 매개 변수가 있고 세 개의 매개 변수가 모두 대상 유형의 속성 중 하나를 파생시키는 데 사용되는 경우가 있습니다.MapStruct 여러 매개 변수가있는 QualifiedByName

속성을 파생시키는 논리를 유지하면서 인터페이스에 기본 매핑 방법을 만들었습니다. 이제는이 메서드를 호출 할 때 주석에 expression = "java(/*method call here*/)"을 사용할 수 있습니다.

mapstruct 주석과 같은 @qualifiedByName의와, 내가 표현을 갖는 주석을 주석 시도하고 qualifiedByName를 사용하여이 작업을 수행 할 수있는 방법이 있습니까,하지만이 작동하지 않습니다

@Mapper 
public interface OneMapper { 

    @Mapping(target="id", source="one.id") 
    //@Mapping(target="qualified",expression = "java(checkQualified (one, projId, code))") 
    @Mapping(target="qualified",qualifiedByName="checkQualifiedNamed") 
    OneDto createOne (One one, Integer projId, Integer val, String code); 

    @Named("checkQualifiedNamed") 
    default Boolean checkQualified (One one, Integer projId, Integer val, String code) { 
     if(one.getProjectId() == projId && one.getVal() == val && one.getCode().equalsIgnoreCase(code)) { 
      return Boolean.TRUE; 
     } 
     return Boolean.FALSE;     
    } 
} 

답변

2

현재 MapStruct하지 않는 여러 소스 속성을 사용하여 매핑 메서드를 지원합니다.

그러나 귀하의 경우에는 @Context을 1.2.0부터 사용할 수 있습니다. 내가 이해 한 바로는 projIdcode이 매핑의 도우미로 존재하며 대상 속성을 매핑하는 데 사용되지 않습니다.

그래서 당신은 (그것은 이론적으로 작동합니다) 같은 것을 할 수 있습니다

@Mapper 
public interface OneMapper { 

    @Mapping(target="id", source="one.id") 
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed") 
    OneDto createOne (One one, @Context Integer projId, @Context String code); 

    @Named("checkQualifiedNamed") 
    default Boolean checkQualified (One one, @Context Integer projId, @Context String code) { 
     if(one.getProjectId() == projId && one.getCode().equalsIgnoreCase(code)) { 
      return Boolean.TRUE; 
     } 
     return Boolean.FALSE;     
    } 
} 

또 다른 대안은 별도의 클래스로 모든 속성을 추출하고 함께 (이 중 여러 매개 변수를 허용 것이라는 점을 통과하는 것 같은 유형).

@Mapper 
public interface OneMapper { 

    @Mapping(target="id", source="one.id") 
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed") 
    OneDto createOne (One one, @Context Filter filter); 

    @Named("checkQualifiedNamed") 
    default Boolean checkQualified (One one, @Context Filter filter) { 
     if(one.getProjectId() == filter.getProjId() && one.getVal() == filter.getVal() && one.getCode().equalsIgnoreCase(filter.getCode())) { 
      return Boolean.TRUE; 
     } 
     return Boolean.FALSE;     
    } 
} 

당신은 다음과 같은 매퍼 호출 할 수 있습니다 :

public class Filter { 

    private final Integer projId; 
    private final Integer val; 
    private final String code; 

    public Filter (Integer projId, Integer val, String code) { 
     this.projId = projId; 
     this.val = val; 
     this.code = code; 
    } 

    //getters 
} 

귀하의 매퍼는 다음과 같이 표시됩니다

클래스의 모습 @Filip 입력에 대한 mapper.createOne(one, new Filter(projId, val, code));

+0

덕분에, 이것은 내가 필요로하는 것에 매우 가깝다. 내가 직면 한 또 하나의 문제가있다. 실제 프로젝트에는 4 개의 매개 변수, 하나의 개체 개체와 3 개의 지원 속성, 3 개의 sup porting 속성이 Integer이고 동일한 유형의 컨텍스트가 여러 개있을 수는 없습니다. 컨텍스트로 엔티티를 만들고 그 중 하나를 소스로 유지하려고 시도했지만 엔티티의 다른 모든 특성을 무시하는 방법으로 시도했습니다. 당신이 이것을 위해 제안 할 수 있다면 제 질문에 코드 스 니펫을 업데이트 했습니까? –

+0

답변을 업데이트했습니다. 기본적으로 모든 속성을'@ Context'를 나타내는 래퍼 클래스로 바꿀 수 있습니다. 그 하나가 훨씬 더 강력하고 당신이 사물을 수행 할 수 있습니다. [컨텍스트/상태 개체 전달] (http://mapstruct.org/documentation/stable/reference/html/#passing-context)에 대한 설명서를 살펴보십시오 – Filip

+0

내 응용 프로그램에서 필터 용도로 새 클래스를 정의하는 것이 힘들지만, 나는 feasibility를 확인하고 Expression을 사용하거나 Filer를 정의하는 두 가지 중 하나를 결정할 것이다. 노력과 시간을 보내 주셔서 감사합니다. –