2016-09-01 2 views
2

Я хочу сопоставить источник, который имеет только конструктор, который принимает 3 параметра. Я получаю следующее сообщение об ошибке:Использование Modelmapper, как мне сопоставить класс без конструктора default/no-args?

Failed to instantiate instance of destination com.novasol.bookingflow.api.entities.order.Rate. Ensure that com.novasol.bookingflow.api.entities.order.Rate has a non-private no-argument constructor.

Это работает, когда я вставляю конструктор без ARGS в пункте назначения источника, но это может привести к неправильному использованию класса, поэтому я предпочел бы не о том, что.

Я попытался с помощью конвертера, но это не похоже на работу:

Converter<RateDTO, Rate> rateConverter = new AbstractConverter<RateDTO, Rate>() { 
    protected Rate convert(RateDTO source) { 
     CurrencyAndAmount price = new CurrencyAndAmount(source.getPrice().getCurrencyCode(), source.getPrice().getAmount()); 
     Rate rate = new Rate(price, source.getPaymentDate(), source.getPaymentId()); 
     return rate; 
    } 
}; 

Можно ли сказать modelmapper, как не на карту к месту назначения с нет нет-арг конструктор?

+0

Вы также можете использовать [Provider] (http://modelmapper.org/user-manual/providers/), чтобы создать экземпляр класса назначения. – Jonathan

+0

Привет, Джонатан, да, вот что я в итоге сделал, см. Мой собственный ответ. –

+0

@Lars: Я столкнулся с той же проблемой, что и вы, но потом попробовал частный no-args ctor (хотя в сообщении говорится иначе). ModelMapper способен читать частный ctor (v0.7.6), и поэтому вы по-прежнему защищены от нежелательной конкретизации/использования вашего класса. Фактически, путем активного размещения частного no-args ctor вы можете (в частности, путем комментирования) заставлять своих коллег осознавать, что вы разработали этот класс, чтобы не выставлять no-args ctor. – Cerbenus

ответ

1

Это, казалось, сделать трюк:

TypeMap<RateDTO, Rate> rateDTORateTypeMap = modelMapper.getTypeMap(RateDTO.class, Rate.class); 
    if(rateDTORateTypeMap == null) { 
     rateDTORateTypeMap = modelMapper.createTypeMap(RateDTO.class, Rate.class); 
    } 
    rateDTORateTypeMap.setProvider(request -> { 
     RateDTO source = RateDTO.class.cast(request.getSource()); 
     CurrencyAndAmount price = new CurrencyAndAmount(source.getPrice().getCurrencyCode(), source.getPrice().getAmount()); 
     return new Rate(price, source.getPaymentDate(), source.getPaymentId()); 
    });