2017-11-02 1 views
0

MapStruct가 내 개체의 모든 JPA 참조를로드하는 문제를 해결하려고합니다 (FetchType.LAZY로 지정되어 있음에도 불구하고).Mapstruct 생성 된 매핑에 필터 함수 적용

나는 '매퍼'에게 '매터드'에 대한 메소드를 추가했다. '매퍼'는 '사용 된'매퍼에 대한 게터가 실제로 필요하기를 원하는 메소드를 제외하고 각 메소드마다 '호출'된다. 내가 만든 메소드

default <T> T checkIt(T o) { 
    return o; 
} 

와 내가 사용하고 매핑 방법에 대해 다음과 같이 생성 된 코드는 다음과 같습니다 : 당신이 볼 수 있듯이

customerOrderDto.setStartDate(checkIt(customerOrder.getStartDate())); 
customerOrderDto.setEndDate(checkIt(customerOrder.getEndDate())); 
customerOrderDto.setCustomer(customerDtoMapper.toDto(customerOrder.getCustomer())); 
customerOrderDto.setTopology(topologyDtoMapper.toDto(customerOrder.getTopology())); 

는, 그것은 그것을 생성 다음과 같이 최고 수준의 매퍼에 인터페이스 클래스이다 처음 두 (시작일 & 시작) b 다른 두 (고객 & 토폴로지)에 대해 자체 mappers가 정의되어 있고 (이 매퍼에 의해 사용됨) 호출하지 않습니다.

'get'을 수행하는 각 메소드에 대해 MapStruct를 호출 할 수있는 방법이 있습니까?

각 .get() 메서드를 래핑 할 수 있다면 엔티티가 아직로드되었는지 확인할 기회가 있어야하며 @JsonView 뷰 매핑을 사용하여 필터링 할 수도 있습니다.

답변

0

우선 MapStruct는 JPA 참조를로드하지 않습니다. MapStruct는 매핑을 수행하는 데 사용하는 Java 코드를 생성하는 주석 프로세서 도구입니다.

매핑을 수행하는 데 사용할 수있는보다 구체적인 방법 (customerDtoMappertopologyDtoMapper)이 있으므로 checkIt 메서드가 사용되지 않습니다. 그 위에 MapStruct는 매핑을 다른 메소드에 전달할 때 매핑을 수행하지 않습니다. 같은 소스와 타겟 유형간에 매핑 할 때만 메소드가 작동합니다.

그러나 할 수있는 일은 customerDtoMappertopologyDtoMapper과 같은 다른 매퍼에서 필요한 검사를 수행하는 것입니다.

가능한 작업은 null이 아닌 값을 반환하는 새 @Context 가능성 및 @BeforeMapping 메서드를 사용하는 것입니다. 그러면이 메서드에서 즉시 반환됩니다. @Context은 수표가 필요한지 여부를 customerDtoMapper에서 확인하는 데 사용할 수 있습니다.

checkIt 방법을 @BeforeMappingMethod으로 만들 수 있습니다. 그러나 전달 된 소스가 아닌 일종의 DTO를 반환하려고 할 때 서명을 변경해야합니다.

+0

답장을 보내 주셔서 감사합니다. MapStruct가 JPA 참조를로드하지 않는다는 것을 알고 있습니다. 단지 특정 유스 케이스를 정의하는 것이 었습니다. 그 시점에서 다른 매퍼에 검사를 추가하는 것은 너무 늦었습니다. "getCustomer()"메서드를 호출하는 행위는 이미 Javassist 프록시를 호출하여 데이터베이스에서 항목을로드하고이를 이해하고 있습니다. @BeforeMapping 옵션도 배제하십시오. 정말로 좋은 점은 실제 생성되는 부분이 "toDto (myFunc (oDest, fDest,() -> customerOrder.getCustomer()))"가되는 지점에 도달 할 수 있다는 것입니다. –

+0

... 또한 대상 필드를 검사하여 JsonView 주석이 있는지 확인하고 전달 된 컨텍스트 (현재 MapStruct와 관련된 다른 문제)를 기반으로 필터링 할 수 있습니다.myFunc는 myFunc (Object oDest, Field fDest, Callable getter)로 정의해야합니다. 여기서 (a) Javassist 프록시가 초기화되었는지 여부 (JPA 유즈 케이스 1)와 null을 반환하는지 확인합니다. (b) check JsonView 주석의 대상 필드 및 필요한보기 (JsonView 유스 케이스 2) 집합에없는 경우 null을 반환합니다 ... –

+0

... 개체를 반환하려면 원할 경우 "return getter.call(); ". MapStruct 코드베이스는 크기가 커서 변경 사항을 찾는 데 도움이 될 수있는 곳을 누군가가 지적 할 수 있다면 좋습니다. 감사. –