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

使用ModelMapper映射抽象类型的字段

贺劲
2023-03-14

我的班级等级如下:

public abstract class Base {
    protected Boolean baseBoolean;
}
public class A extends Base {
    private BigDecimal amount;
}

并尝试将DTO映射到实体

public class DTO {
    private Base details;
}
public class Entity {
    private Base details;
}

地图如下:

    public static void main(String[] args) {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setDeepCopyEnabled(true);

        A a = new A();
        a.setAmount(BigDecimal.ONE);
        a.setBaseBoolean(true);
        DTO request = DTO.builder().base(a).build();

        Entity entity = modelMapper.map(request, Entity.class);
        System.out.println(entity);
    }

我在详细信息字段中收到带有A或B的DTO,这是在调试器中检查的。但是模型制图者投掷

无法实例化目标组织的实例。包裹基础确保该组织。包裹Base有一个非私有的无参数构造函数。

我尝试使用显式提供程序(没有用于此映射):

modelMapper.typeMap(A.class, Base.class).setProvider(new Provider<Base>() {
            @Override
            public Base get(ProvisionRequest<Base> r) {
                return new A();
            }
        });

我还尝试像这样实现自定义转换器(也没有执行):

modelMapper.typeMap(A.class, Base.class).setConverter(new Converter<A, Base>() {
            @Override
            public Base convert(MappingContext<A, Base> mappingContext) {
               return modelMapper.map(mappingContext.getSource(), A.class);
            }
         });

模型映射器似乎没有对字段使用这个类型映射,只对hierarhy的根使用。在这种情况下,我如何映射类层次结构?

共有1个答案

怀展
2023-03-14

正如您所发现的,启用深度复制时会出现问题:modelMapper。getConfiguration()。setDeepCopyEnabled(true)

解决方案是定义一个转换器

ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setDeepCopyEnabled(true); // this triggers the problem

// the converter resolves it
Converter<Base, Base> baseBaseConverter = context ->
        modelMapper.map(context.getSource(), context.getSource().getClass());

modelMapper.createTypeMap(Base.class, Base.class).setConverter(baseBaseConverter);

现场演示

这里有一个关于这个主题的更详细的帖子。

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

  • 我正在使用ModelMapper框架(http://modelmapper.org/)用于在Java中映射对象。我在映射包含抽象类的具体类(DTO到Entite)时遇到了一个问题。 示例:任务有一个抽象项列表 抽象项目是问题和标准。 制图方法: ModelMapper尝试创建AbstractItem的新实例,该实例引发异常。有没有办法在运行时映射抽象类<喜欢问题吗-

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

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

  • 我有一个用户的Entity-DTO转换器,如下所示: 我有很多Entity-DTO要管理,所以我想像这样抽象转换器 我的问题是:我必须放置什么而不是???

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