6

我试图了解如何正确配置 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 的映射配置来替换默认映射,它不会改变。

谁能给我一个提示如何配置这样的映射?谢谢!

亲切的问候,何塞

4

2 回答 2

8

是的,您可以使用ClassMapBuilder.use它将自动使用父类上的现有映射。

在这里,我已经有了从TicketEntityto的现有映射Conversation,我想将它映射到新的DetailedConversation(有额外的字段),我这样做了:

    mapperFactory.classMap(TicketEntity.class, DetailedConversation.class)
            .use(TicketEntity.class, Conversation.class)
            .customize(conversationMapper())
            .byDefault()
            .register();
于 2015-06-02T17:30:59.373 回答
0
factory.classMap(Parent.class, Parent.class).byDefault().register(); 
factory.classMap(ChildA.class, ChildA.class).byDefault().register();
factory.classMap(ChildB.class, ChildB.class).byDefault().register();
于 2017-12-05T13:06:45.200 回答