4

我需要用 Orika、OrikaA 和 OrikaB 映射两个类。OrikaB 类有一个构造函数,其中一个参数在 OrikaA 类中不存在。为了将 OrikaA 映射到 OrikaB,我使用了自定义 ObjectFactory:

public class OrikaA {
    String fieldA;

    public OrikaA(String fieldA) {
        this.fieldA = fieldA;
    }

    public String getFieldA() {
        return fieldA;
    }
}

public class OrikaB {
    String fieldA;
    String fieldB;

    public OrikaB(String fieldA, String fieldB) {
        this.fieldA = fieldA;
        this.fieldB = fieldB;
    }

    public String getFieldA() {
        return fieldA;
    }

    public String getFieldB() {
        return fieldB;
    }
}

@Test
public void orikaObjectFactoryTest() {
    mapperFactory = new DefaultMapperFactory.Builder().build();
    mapperFactory.classMap(OrikaA.class, OrikaB.class).register();

    Type<OrikaA> orikaAType = TypeFactory.valueOf(OrikaA.class);
    Type<OrikaB> orikaBType = TypeFactory.valueOf(OrikaB.class);

    ObjectFactory<OrikaA> objectFactoryOrikaA = (Object o, MappingContext mappingContext) -> {
        OrikaB source = (OrikaB) o;
        return new OrikaA(source.getFieldA());
    };

    ObjectFactory<OrikaB> objectFactoryOrikaB = (Object o, MappingContext mappingContext) -> {
        OrikaA source = (OrikaA) o;
        return new OrikaB(source.getFieldA(), null);
    };

    mapperFactory.registerObjectFactory(objectFactoryOrikaA, orikaAType, orikaBType);
    mapperFactory.registerObjectFactory(objectFactoryOrikaB, orikaBType, orikaAType);

    MapperFacade mapper = mapperFactory.getMapperFacade();

    OrikaA orikaA = new OrikaA("text");
    OrikaB orikaB = mapper.map(orikaA, OrikaB.class);

    assertEquals(orikaA.getFieldA(), orikaB.getFieldA());
    assertNull(orikaB.getFieldB());
}

是否有另一种方法可以在不使用自定义 ObjectFactory 的情况下完成相同的任务?

4

0 回答 0