2015-01-12 1 views
0

나는 www.modelmapper.org을 사용하고 있으며 동일한 "플랫"자바 DTO를 여러 "계층 적"DTO로 매핑하려고합니다.
"플랫"DTO에는 여러 가지 기본 속성이 있습니다.
"계층 적"에는 여러 가지 기본 유형을 보유하는 복잡한 유형이 있습니다. 이러한 DTO는 매우 유사하지만 동일하지는 않습니다.

Java ModelMapper 플랫 모델 - 계층 적 모델

"플랫"DTO :

class TransactionRequest 
{ 
    String cashierNumber; 
    Long amount; 
    Integer currency; 

    public String getCashierNumber {.. 
    ... 
} 

"계층 DTO들 :

class PurchaseRequest 
{ 
    POSInfo posInfo; 
    Amount amount;   
    ...  

    public PosInfo getPosInfo {.. 
    public Amount getAmount { .. 
    ... 
} 

class CancelRequest 
{ 
    POSInfo posInfo; 
    Amount amount;   
    ... 

    public PosInfo getPosInfo {.. 
    public Amount getAmount { .. 
    ... 
} 

class Amount 
{  
    BigDecimal value; 
    Integer currency; 

    public Integer getCurrency{.. 
    ... 
} 

class PosInfo 
{  
    String cashierNumber; 

    public String getCashierNumber {.. 
} 

TransactionRequest 1로 매핑한다) PurchaseRequest 2) CancelRequest의
하나. 문제는, 양이 Long (부 단위)에서 BigDecimal (소수 단위의 주요 단위로 변환되어야 함)입니다. ts). 내 자신의 Long to BigDecimal 변환기를 작성하여이 작업을 수행했습니다. 이제 재사용 가능한 방식으로 필요한 매핑을 정의하는 데 문제가 있습니다. 내가 원하지 않는 것은이 같은 각 대상 유형에 대한 매핑을 정의하는 것입니다 :

class PurchaseMap extends PropertyMap<.. 
protected void configure() 
{ 
using(new LongToBigDecimalConverter(...)).map().getAmount().setValue(source.getAmount()); 
... 
} 

class CancelMap extends PropertyMap<.. 
protected void configure() 
{ 
using(new LongToBigDecimalConverter(...)).map().getAmount().setValue(source.getAmount()); 
... 
} 

내가 금액 DTO의 매핑을 정의하는 하나의 시간을 가지고 싶습니다 (다른 모든 서브 타입 매핑 등 PosInfo 등으로) 매핑 한 다음이 매핑을 다시 사용하십시오. 몇 가지 옵션을 시도 :

내가 시도한 첫 번째 일은 내 ModelMapper에서 금액 DTO로 TransactionRequest에 대한 매핑을 선언했다. 먼저,이 매핑을 선언하는 것만으로도 TransactionRequest를 PurchaseRequest에 매핑 할 때 매핑 메커니즘을 선택하기에 충분하다고 가정했습니다. 그러나 그런 경우는 아닙니다.

  1. 내가 양에 TransactionRequest의 매핑을위한 PropertyMap을 만들어 : 내가 시도한 두 번째 것은이 작업을 수행하지만, 지나치게 복잡한 것 같다

    .
  2. 커스텀 변환기 인 TransactionRequest를 Amount로 생성했습니다. 이 변환기는 생성자에 ModelMapper가 필요합니다.

    public class AmountMap extends PropertyMap<TransactionRequest , Amount> 
    { 
        .... 
    
        protected void configure() 
        { 
         using(new LongToBigDecimalConverter(...)).map().getAmount().setValue(source.getAmount()); 
         } 
         ... 
        } 
    } 
    
    public class TransactionRequestToAmountConverter extends AbstractConverter<TransactionRequest, Amount> 
    { 
        private final ModelMapper mapper; 
    
        public TransactionRequestToAmountConverter(ModelMapper mapper) 
        { 
         this.mapper = mapper; 
        } 
    
        public Amount convert(TransactionRequest transactionRequest) 
        { 
         return mapper.map(transactionRequest, Amount.class); 
        } 
    } 
    
    public class PurchaseRequestMap extends PropertyMap<TransactionRequest, PurchaseRequest> 
    { 
        private final ModelMapper mapper; 
    
        public PurchaseRequestMap(ModelMapper mapper) 
        { 
         this.mapper = mapper; 
        } 
    
        protected void configure() 
        {   
         using(new TransactionRequestToAmountConverter(mapper)).map(source).setAmount(null); 
         ... 
    
        } 
    } 
    

    : I 생성자로 전달하는 ModelMapper 코드 (1)로부터 PropertyMap 만든 ModelMapper)

  3. 내가 PurchaseRequest의 PropertyMaps 및 CancelRequest 여기

이 변환기를 사용된다 거기에 더 간단한 접근법을 알고있는 사람이 있습니까?

답변

0

시도 매핑 자체로 AmountLong :

매핑 후 다른 유형에 사용되며 (I 제대로 유형을 읽고 있어요 경우) 다른 것들에 대한 필요성을 제거해야
modelMapper.createTypeMap(Long.class, Amount.class).setConverter(new Converter<Long, Amount>() { 
    //... convert Long to Amount 
}); 

.

관련 문제