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

时间:2014-06-23 14:24:00

标签: 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;
    }
}

我按照以下方式进行映射

    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的映射配置中,它也不会改变。

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

亲切的问候, 何

3 个答案:

答案 0 :(得分:7)

是的,你可以使用ClassMapBuilder.use来自动使用父类的现有映射。

此处我已经有TicketEntityConversation的现有映射,我想将其映射到新的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)

是否支持类继承?

是。 Orika将重用已为给定类层次结构定义的映射器,您可以使用ClassMapBuilder.use

自定义它

FAQ