当前位置: 首页 > 知识库问答 >
问题:

ModelMapper:混合隐式和显式映射?

芮安顺
2023-03-14

为了编写所需的最少代码量,我尝试让ModelMapper生成其隐式映射,并且只为那些无法自动映射的属性编写显式属性映射。

如果我让ModelMapper使用以下命令生成隐式映射:

modelMapper.createTypeMap(SourceType.class, DestType.class);

它抱怨setSomeId具有多个可能的映射。然后,我尝试使用以下方法修复该问题:

modelMapper.addMappings(new PropertyMap<SourceType, DestType>() {
    protected void configure() {
        map().setSomeId(source.getProperty().getWeirdID());
    }
});

然而,我发现ModelMapper仍在抱怨,因为实际上在createTypeMap上抛出了一个异常,所以它没有机会访问我的自定义映射代码。

如果我反转这两个语句,我会得到一个错误:

JAVAlang.IllegalStateException:类SourceType和类DestType的类型映射已存在

如果我完全省略了createTypeMap,ModelMapper会抱怨缺少DestType的所有其他属性的映射(那些能够使用createTypeMap自动映射的属性)。

我在文档中没有找到明确的线索,说明是否支持将隐式映射与显式映射混合,以及它是如何实现的。

有人能帮忙吗?

共有3个答案

壤驷文华
2023-03-14

假设我们想将代码映射到目的地。而不是

Destination destination = modelMapper.map(source, Destination.class);

为了结合显式映射和隐式映射,我们需要在TypeMap中添加implified Mappings()

public Destination mapSourceToDestination(Source source) {
            TypeMap<Source, Destination> typeMap = modelMapper
                    .typeMap(Source.class, Destination.class)
                    .implicitMappings()
                    .addMappings(mapper -> {
                        mapper.map(source -> source.getPropetryOne().getSubPropetryOne(), Destination::setPropetryA);
                    });
            return typeMap.map(source);
        }
仲孙钊
2023-03-14

我不知道这对您来说是否仍然是一个问题,我必须承认我是ModelMapper的新手。我一直在为你曾经/曾经遇到的同样问题而挣扎。我好像已经解决了。

    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());
    });

基本上,我首先尝试获取TypeMap,如果它已经存在,否则我将创建一个新的/修改的映射。

希望有帮助

祁绪
2023-03-14

而不是ModelMapper。createTypeMap尝试使用ModelMapper。addMappings(第一个)。这仍然会创建(并返回)一个类型映射,但在执行此操作时会考虑属性映射

 类似资料:
  • 问题内容: 我在使用Hibernate生成无效SQL时遇到问题。具体来说,混合和匹配隐式和显式联接。这似乎是一个开放的错误。 但是,我不确定 为什么 这是无效的SQL。我想出了一个生成相同语法异常的小型玩具示例。 架构图 数据 工作SQL 这两个查询均有效。我意识到有笛卡尔积;那是故意的。 明确加入: 隐式加入: 无效的SQL 此查询不适用于MSSQL 2000/2008或MySQL: 在MS20

  • 在过去,我写过一些java程序,使用两个线程。第一个线程(生产者)从API(C库)读取数据,创建一个java对象,将该对象发送到另一个线程。C API正在传递一个事件流(无限)。线程使用LinkedBlockingQueue作为管道交换对象(put、poll)。第二个线程(使用者)正在处理对象。(我还发现,线程中的代码更易读。第一个线程处理C API的内容并生成适当的java对象,第二个线程不受C

  • 问题内容: 我正在阅读SeleniumHQ文档,并遇到以下声明。 “警告:不要混合使用隐式等待和显式等待。这样做可能会导致不可预知的等待时间。例如,将隐式等待设置为10s,将显式等待设置为15秒,则可能导致20秒后发生超时。” 由于某些原因,我无法理解这一点。对于我来说,总超时时间是20秒。谁能解释我是否缺少什么? 编辑 我的问题不是关于混合这些等待的实现/后果。 这完全与文档中的语句和超时计算有

  • 本文向大家介绍Android隐式和显式意图,包括了Android隐式和显式意图的使用技巧和注意事项,需要的朋友参考一下 示例 显式意图用于在同一应用程序包内启动活动或服务。在这种情况下,将明确提及所需类的名称: 但是,对于用户设备上安装的可以处理该意图的任何应用程序,系统会在系统上发送隐式意图。这用于在不同应用程序之间共享信息。 可以在Android Developer文档中找到有关差异的更多详细

  • 本文向大家介绍VBA 隐式和显式声明,包括了VBA 隐式和显式声明的使用技巧和注意事项,需要的朋友参考一下 示例 如果代码模块不包含Option Explicit在模块顶部,则编译器将在使用它们时自动(即“隐式”)为您创建变量。它们将默认为变量类型Variant。 在上面的代码,如果Option Explicit指定,代码将中断,因为它缺少必要Dim的陈述someVariable和someOthe

  • 我将ModelMapper与Spring一起使用。在我的控制器类中,我正在自动连接ModelMapper bean: 我想在控制器方法中的模型类和DTO之间进行显式映射,例如: 然后使用映射器映射类。 我的问题是,在每个控制器方法调用中添加显式映射是正确的吗?对象建模映射器的内存大小会开始增长吗? 另一个解决方案是在创建ModelMapperbean时只添加一次映射,但我认为在bean配置中添加映