我试图了解如何在继承类的情况下正确配置Orika类映射。
我已经设置了一个简单的例子,以便能够理解什么在起作用,什么不起作用,但我不明白。
public class Source {
private final String alpha;
public Source(final String alpha) {
this.alpha = alpha;
}
public String getAlpha() {
return alpha;
}
}
public final class SourceExtended extends Source {
private final String beta;
public SourceExtended(final String alpha, final String beta) {
super(alpha);
this.beta = beta;
}
public String getBeta() {
return beta;
}
}
public final class Target {
private final String alpha;
private final String beta;
public Target (final String alpha) {
this(alpha, null);
}
public Target(final String alpha, final String beta) {
this.alpha = alpha;
this.beta = beta;
}
public String getAlpha() {
return alpha;
}
public String getBeta() {
return beta;
}
}
我按照以下方式进行映射
Source s = new Source("alpha");
Target t = this.mapper.map(s, Target.class);
SourceExtended s = new SourceExtended("alpha", "beta");
Target t = this.mapper.map(s, Target.class);
我尝试了以下配置......
factory.classMap(SourceExtended.class, Target.class)
.byDefault()
.register();
factory.classMap(Source.class, Target.class)
.byDefault()
.register();
结果:两个映射都已编译并运行,但未在SourceExtended对象的目标中设置beta,因此SourceExtended的映射不起作用。
所以我认为如果我明确说明要使用的构造函数,那么beta也应该映射:
factory.classMap(SourceExtended.class, Target.class)
.byDefault()
.constructorA("alpha", "beta")
.constructorB("alpha", "beta")
.register();
factory.classMap(Source.class, Target.class)
.byDefault()
.register();
但结果是一样的。 beta未映射。如果我通过指定字段替换默认映射,或者将构造函数添加到Source.class的映射配置中,它也不会改变。
任何人都可以给我一个提示如何配置这样的映射吗?谢谢!
亲切的问候, 何
答案 0 :(得分:7)
是的,你可以使用ClassMapBuilder.use
来自动使用父类的现有映射。
此处我已经有TicketEntity
到Conversation
的现有映射,我想将其映射到新的DetailedConversation
(有额外的字段),我这样做了:
mapperFactory.classMap(TicketEntity.class, DetailedConversation.class)
.use(TicketEntity.class, Conversation.class)
.customize(conversationMapper())
.byDefault()
.register();
答案 1 :(得分:-1)
factory.classMap(Parent.class, Parent.class).byDefault().register();
factory.classMap(ChildA.class, ChildA.class).byDefault().register();
factory.classMap(ChildB.class, ChildB.class).byDefault().register();
答案 2 :(得分:-2)