Dozer mapping для объектов без сеттеров - PullRequest
0 голосов
/ 05 июля 2018
public class ParentOne {

    private List<ChildOne> child;

    public List<ChildOne> getChild() {
        if (child == null) {
            child = new ArrayList<ChildOne>();
        }
        return child;
    }
}

public class ParentTwo {

    private List<ChildTwo> child;

    public List<ChildTwo> getChild() {
        if (child == null) {
            child = new ArrayList<ChildTwo>();
        }
        return child;
    }
}

Отображение DOZER

<mapping>
    <class-a>ParentOne</class-a>
    <class-b>ParentTwo</class-b>
    <field>
        <a is-accessible="true">child</a>
        <b is-accessible="true">child</b>
    </field>
</mapping>

public class Client {

    public static void main(String[] args) {
        ParentOne parentOne = new ParentOne();
        parentOne.getChild().add(new ChildOne());
        parentOne.getChild().add(new ChildOne());

        ParentTwo parentTwo = dozerBeanMapper.map(parentOne, ParentTwo.class);
    }
}

Родительский класс не содержит установщиков для списка. поэтому я сделал отображение бульдозера таким образом, чтобы получить прямой доступ к полям. Сопоставление происходит нормально, но проблема в том, что после сопоставления экземпляр parentTwo содержит дочерний элемент типа ChildOne, он должен быть ChildTwo.

Я что-то пропустил?

1 Ответ

0 голосов
/ 05 июля 2018

Добавьте подсказки (см. здесь для получения дополнительной информации).

<mapping>
    <class-a>ParentOne</class-a>
    <class-b>ParentTwo</class-b>
    <field>
        <a is-accessible="true">child</a>
        <b is-accessible="true">child</b>
        <a-hint>ChildOne</a-hint>
        <b-hint>ChildTwo</b-hint>
    </field>
</mapping>

Возможно, вам придется использовать полные имена классов, а не просто ChildOne и ChildTwo, но в остальном он должен работать.

...