Как мне сопоставить класс с интерфейсом с Orika? - PullRequest
0 голосов
/ 04 февраля 2020

Я хотел бы сопоставить Java объекты друг с другом, используя Orika в текущей версии 1.5.4 .

С одной стороны, У меня есть неизменяемые объекты, частные конечные свойства которых должны быть установлены из конструктора:

public class Source {

    private final String content;

    public Source(String content) {
        this.content = content;
    }

}

С другой стороны, у меня есть только интерфейсы:

public interface Destination {

    String getContent();
    setContent(String content);

    static Books create() {
        return TypeFactory.create(Destination.class);
    }

}

Я использую универсальный c TypeFactory для создания реализаций (прокси) для этих экземпляров на лету:

public class TypeFactory{
    public static <T> T create(Class<T> type) {
        // on the fly constructs a class
        // that implements the Destination interface
        return proxyFactory.createProxyForType(type);
    }
}

Прямой способ отобразить эти два с ошибкой с помощью No concrete class mapping defined for source class:

public Destination map(Source source) {
    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    mapperFactory.classMap(Source.class, Destination.class)
        .constructorA("content").byDefault().register();
    MapperFacade mapper = mapperFactory.getMapperFacade();
    return mapper.map(domainBook, Books.class);
}

Я предполагаю, что это потому что одна сторона - это только интерфейсы, и мне нужно предоставить фабрику, как создавать для них реальные классы, но это все равно не получается:

private static class DestinationFactory implements ObjectFactory<Destination> {
    @Override
    public Destination create(Object o, MappingContext mappingContext) {
        return Destination.create();
    }
}

public Destination map(Source source) {
    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    mapperFactory.classMap(Source.class, Destination.class)
        .constructorA("content").byDefault().register();
    mapperFactory.registerObjectFactory(new DestinationFactory(), Destination.class);
    MapperFacade mapper = mapperFactory.getMapperFacade();
    return mapper.map(domainBook, Books.class);
}

Может ли кто-нибудь помочь заставить это работать?

...