1

我有一个 Class1,我想将它转换为 Class2。

Class1 和 Class2 都有一个字段:AbstractClass3 something.

AbstractClass3被声明为abstract,但它的值是 Class1&2 字段中的具体实现。

在 Class1 和 Class2 之间转换时,我得到了这个异常:

No concrete class mapping defined for source

我希望 Orika 在目标类 (Class2) 中使用与源类 (Class1) 相同的实现。

实现这一目标的最佳方法是什么?

4

1 回答 1

3

我试图看看你的问题,但我想我可能遗漏了一些东西(或者我可能没有正确理解这个问题),因为似乎默认情况下 Orika 已经使用源的实现来创建目标的实现(如果配置了类映射),请看一下代码。

public class OrikaTest {

private MapperFacade mapper;
private MapperFactory factory;

@Before
public void setUp() {
    factory = new DefaultMapperFactory.Builder().mapNulls(false).build();
    factory.registerClassMap(factory.classMap(One.class, Two.class)
            .byDefault()
            .toClassMap());
    factory.registerClassMap(factory.classMap(Class3Impl1.class, Class3Impl1.class)
            .byDefault()
            .toClassMap());
    factory.registerClassMap(factory.classMap(Class3Impl2.class, Class3Impl2.class)
            .byDefault()
            .toClassMap());
    mapper = factory.getMapperFacade();
}

public static class One {
    public Class3 class3;
}

public static class Two {
    public Class3 class3;
}

public static abstract class Class3 {
    public String x = "x";
}

public static class Class3Impl1 extends Class3 {
    public String y = "y";
}

public static class Class3Impl2 extends Class3 {
    public String y = "y";
}

@Test
public void mapping1Test() {
    One one = new One();
    one.class3 = new Class3Impl1();

    Two two = mapper.map(one, Two.class);

    assertEquals(one.class3.x, two.class3.x);
    assertTrue(Class3Impl1.class.isInstance(two.class3));
    assertEquals(((Class3Impl1) one.class3).y, ((Class3Impl1) two.class3).y);
}

@Test
public void mapping2Test() {
    One one = new One();
    one.class3 = new Class3Impl2();

    Two two = mapper.map(one, Two.class);

    assertEquals(one.class3.x, two.class3.x);
    assertTrue(Class3Impl2.class.isInstance(two.class3));
    assertEquals(((Class3Impl2) one.class3).y, ((Class3Impl2) two.class3).y);
}
于 2015-10-26T20:27:06.987 回答