如何为类层次结构配置Orika classMap?

jos*_*ose 5 java mapping orika

我正在尝试了解如何正确配置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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在进行如下映射

    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);
Run Code Online (Sandbox Code Playgroud)

我尝试了以下配置......

factory.classMap(SourceExtended.class, Target.class)
    .byDefault()
    .register();

factory.classMap(Source.class, Target.class)
    .byDefault()
    .register();
Run Code Online (Sandbox Code Playgroud)

结果:两个映射都已编译并运行,但未在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();
Run Code Online (Sandbox Code Playgroud)

但结果是一样的.beta未映射.如果我通过指定字段或通过将构造函数添加到Source.class的映射配置来替换默认映射,则它不会更改.

任何人都可以给我一个提示如何配置这样的映射?谢谢!

亲切的问候,何塞

Xor*_*rty 8

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

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

    mapperFactory.classMap(TicketEntity.class, DetailedConversation.class)
            .use(TicketEntity.class, Conversation.class)
            .customize(conversationMapper())
            .byDefault()
            .register();
Run Code Online (Sandbox Code Playgroud)

  • 你能重写这个以使用他的对象吗?我在 Orika 网站上找不到 .use 方法的文档... (2认同)