【问题标题】:Using Modelmapper, how do I map to a class with no default/no-args constructor?使用 Modelmapper,我如何映射到没有默认/无参数构造函数的类?
【发布时间】:2016-09-01 06:33:49
【问题描述】:

我想映射到一个源目标,它只有一个带有 3 个参数的构造函数。我收到以下错误:

无法实例化目标 com.novasol.bookingflow.api.entities.order.Rate 的实例。确保 com.novasol.bookingflow.api.entities.order.Rate 有一个非私有的无参数构造函数。

当我在源目标中插入一个无参数的构造函数时它会起作用,但这可能会导致类的滥用,所以我宁愿不这样做。

我尝试过使用转换器,但这似乎不起作用:

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 如何使用无参数构造函数映射到目的地?

【问题讨论】:

  • 您也可以使用Provider 来实例化您的目标类。
  • 嗨乔纳森,是的,这就是我最终所做的,请参阅我自己的答案。
  • @Lars:我遇到了和你一样的问题,但后来尝试了一个私有的无参数 ctor(即使消息另有说明)。 ModelMapper 能够读取私有 ctor (v0.7.6),因此您仍然可以防止不必要的实例化/使用您的类。事实上,通过主动放置一个私有的无参数 ctor,您可以(特别是通过评论)让您的同行意识到您设计这个类以不公开无参数 ctor。

标签: modelmapper


【解决方案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());
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多