我有以下模型类:
@Data
public class M {
private String name;
private int age;
private int height;
}
和以下Dto类:
@Data
public class Dto {
private String name;
private B nested;
}
@Data
public class C extends B {
private int height;
}
其中B是抽象类:
@Data
public abstract class B {
private int age;
}
我想使用ModelMapper将Model实例转换为Dto实例,并将模型的age和height属性转换为正确填充的C对象。
一个例子:
model = { name: "Steve", age: 35, height: 185 } of Model
收件人:
dto = { name: "Steve", nested: { age: 35, height: 185 } of C } of Dto
我尝试了以下操作:
mapper.createTypeMap(Model.class, Dto.class).addMappings(new PropertyMap<Model, Dto>() {
@Override
protected void configure() {
map(source, destination.getNested());
}
});
mapper.createTypeMap(Model.class, C.class);
以dto.getNested() == null
结尾。
也尝试添加
public Model getSelf() { return this; }
(出于基本好奇心)进入Model类,并重新定义属性映射器以使其具有:
with(new Provider<C>(req => new C())).map(source.getSelf(), destination.getNested());
其中填充了dto.getNested()
,但没有填充dto.getNested().getHeight()
。
使用ModelMapper可以实现吗?
感谢所有建议。
答案 0 :(得分:0)
事实证明,除了拥有提供程序并手动列出所有从平面嵌套的属性外,没有其他方法可以配置映射器。由于我想避免这种情况,所以我陷入了下面的转换器中:
Converter<M, C> converter = new Converter<M, C>() {
@Override
public C convert(MappingContext<M, C> context) {
C c = new C();
mapper.map(context.getSource(), c);
return c;
}
};
,并在M到Dto配置中使用此转换器将source
映射到destination.getNested()
。这也假定转换器需要访问映射器。嗯。