我的课上有以下课程:
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,这是通过调试器进行检查的。但是模型映射器抛出了
无法实例化目的地实例 org.package.Base。 确保这件事 org.package.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);
}
});
似乎modelmapper不会将这种类型映射用于字段,而仅用于层次结构的根。 在这种情况下,我该如何映射班级等级?
答案 0 :(得分:0)
您已经发现,启用深度复制时出现问题:modelMapper.getConfiguration().setDeepCopyEnabled(true)
。
一种解决方案是定义一个Converter<Base, Base>
,如下所示:
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);
Here是关于该主题的更详细的文章。