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

ModelMapper:在运行时映射抽象类

陶温书
2023-03-14

我正在使用ModelMapper框架(http://modelmapper.org/)用于在Java中映射对象。我在映射包含抽象类的具体类(DTO到Entite)时遇到了一个问题。

示例:任务有一个抽象项列表
抽象项目是问题和标准。

public class TaskDTO {
   ...
   private List<AbstractItemDTO> items;
}

制图方法:

// task is an TaskDTO object
return getModelMapper().map(task, TaskEntity.class);

ModelMapper尝试创建AbstractItem的新实例,该实例引发异常。有没有办法在运行时映射抽象类<喜欢问题吗-

共有3个答案

松和璧
2023-03-14

其中使用ModelMapper的kotlin解决方案

DTO(又名源类)

abstract class BaseRequirementDTO()
class AttributeRequirementDTO(

        var attribute: Attribute = Attribute.STRENGTH,
        var attributeValue: Long = 10

) : BaseRequirementDTO()
class LevelRequirementDTO(

        var requiredLevel: Long = 1

) : BaseRequirementDTO()

我的模型(又名目的地类)

abstract class BaseRequirement() : Model()
class AttributeRequirement(

        var attribute: Attribute = Attribute.STRENGTH,
        var attributeValue: Long = 10

) : BaseRequirement()
class LevelRequirement(

        var requiredLevel: Long = 1

) : BaseRequirement()

映射器配置

val mapper = ModelMapper()
mapper.configuration.matchingStrategy = MatchingStrategies.STRICT
mapper.createTypeMap(BaseRequirement::class.java, BaseRequirementDTO::class.java)
mapper.typeMap(AttributeRequirementDTO::class.java, BaseRequirement::class.java)
        .setProvider { request -> mapper.map(request.source, AttributeRequirement::class.java) }
mapper.typeMap(LevelRequirementDTO::class.java, BaseRequirement::class.java)
        .setProvider { request -> mapper.map(request.source, LevelRequirement::class.java) }

ModelMapper版本:2.3.7

https://github.com/modelmapper/modelmapper/issues/182#issuecomment-660965119

明松
2023-03-14

我无法用ModelMapper解决这个问题。因此,我切换到推土机
Dozer是Java中对象映射的一个很好的工具。而且它也很容易使用。可以在XML文件中定义相应的映射类。

这里是文档的链接。http://dozer.sourceforge.net/documentation/mappings.html

我的Spring解决方案
推土机bean。xml

<bean class="org.dozer.spring.DozerBeanMapperFactoryBean" lazy-init="false">
        <property name="mappingFiles">
            <list>
                <value>META-INF/mapping/dozer-config.xml</value>
            </list>
        </property>
</bean>

推土机配置。xml

<mapping>
            <class-a>com.packagename.dto.QuestionDTO</class-a>
            <class-b>com.packagename.entities.core.Question</class-b>
</mapping>
<mapping>
        <class-a>com.packagename.dto.CriteriaDTO</class-a>
        <class-b>com.packagename.entities.core.Criteria</class-b>
</mapping>
魏明亮
2023-03-14

我也有这个问题,并解决了这个问题:

public void configure(ModelMapper modelMapper) {
    modelMapper.typeMap(QuestionDto.class, AbstractItem.class)
            .setConverter(converterWithDestinationSupplier(Question::new));
    modelMapper.typeMap(CriteriaDto.class, AbstractItem.class)
            .setConverter(converterWithDestinationSupplier(Criteria::new));
}

private <S, D> Converter<S, D> converterWithDestinationSupplier(Supplier<? extends D> supplier ) {
    return ctx -> ctx.getMappingEngine().map(ctx.create(ctx.getSource(), supplier.get()));
}

转换器使用供应商创建所需的实例,然后使用正确的类型映射(QuestionDto)-

 类似资料:
  • 问题内容: 我正在使用ModelMapper Framework(http://modelmapper.org/)映射Java中的对象。在映射包含抽象类的具体类(DTO到实体)时遇到了一个问题。 示例:任务具有AbstractItems列表。 AbstractItems是问题和条件。 映射方法: ModelMapper尝试创建一个AbstractItem的新实例,该实例将引发异常。有没有办法在运行

  • 我的班级等级如下: 并尝试将DTO映射到实体 地图如下: 我在详细信息字段中收到带有A或B的DTO,这是在调试器中检查的。但是模型制图者投掷 无法实例化目标组织的实例。包裹基础确保该组织。包裹Base有一个非私有的无参数构造函数。 我尝试使用显式提供程序(没有用于此映射): 我还尝试像这样实现自定义转换器(也没有执行): 模型映射器似乎没有对字段使用这个类型映射,只对hierarhy的根使用。在这

  • 我有两个需要映射的继承层次结构。一个层次结构是国内的,另一个是野生的。我有抽象的Domestic动物和具体的DomesticCat和DomesticDog扩展它。在第二个层次结构中,我有抽象的Wild动物和具体的WildCat和WildDog扩展它。我还有另外两个类,分别是WildAnimalFeeder具有Wild动物的成员对象和DomesticAnimalFeeder具有DomesticAni

  • 我与ModelMapper框架有麻烦。请解释为什么我看到以下行为。 我在build.gradle有以下依赖性 和一个类客户: 我还有一个地图绘制工具: 还有一个测试 在fred()中,方法输出是非红色的“Customer{name=fred,age=40}”(“Customer{name=null,age=40}”)。你能解释一下为什么吗?为什么我在第一个方法中看不到输出“George”?

  • 我有一个父类和子类,其各自的DTO如下 当我试图将父映射到父映射到父映射到父映射时,我得到了堆栈溢出错误。 请帮我解决这个问题。

  • 我正在尝试使用ModelMapper映射对象树。 我创建了一个例子来说明我的问题: 类包含多个属性 类包含类型为Sub的对象和(至少)另一个属性 类目标包含一个简单的属性列表 源属性和目标属性的类型不同 代码: 我正在寻找一种配置单个ModelMapper实例的方法,以便满足以下约束: modelMapper能够将Sub类型的对象转换为目标对象 不幸的是,行<代码>映射(source.sub,de