Modelmapper循环映射

时间:2016-12-15 12:13:56

标签: modelmapper

我的父母和子女班级各自的DTO如下

class Parent {
    List<Child> children;
    // setters and getters
}

class Child {
    Parent parent;
}

class ParentDto {
    List<ChildDto> children;
    // setters and getters
}

class ChildDto {
    ParentDto parent;
    // setters and getters
}    

当我尝试将Parent映射到ParentDto时,我得到了StackOverflowError。

请帮我解决问题。

1 个答案:

答案 0 :(得分:0)

我知道这篇文章很旧,但是我会尝试给出一个答案,以防Google有人到达这里。

可能您创建了动态对象。

最近我遇到了这样的问题。在我的情况下,我有一个扩展Person的学生班。而“人”具有“人”类型的其他三个属性:父亲,母亲和负责任的人。万一我有一个圆形关系。当我运行JUnits测试时,我得到了一个循环调用。我没有得到stakOverflow,因为Spring(一段时间后)关闭了数据库连接。

我解决了这个问题,从我的Person类中删除了动态对象的创建。

解决此问题的另一种方法是在映射器中添加条件。您可以阅读有关条件here的更多信息。例如,您可以使用一些条件说:“如果person属性id为10,则不需要映射它。”。这样我们可以避免无限映射。 好吧,让我们看一些代码片段:

学生班:

export const MyComponent:React.SFC<MyComponentProps> = ({ prop1, prop2, prop3 }) => (
<div>
    { prop1 ? prop2 : prop3 }
</div>
);

人员班:

public class Student extends Person implements IStudent {

    private Person financialResponsible;

    // Getters and setters.

}

StudentDTO类:

public class Person implements IPerson {

    private Long id;
    private String name;
    private Person father;
    private Person mother;
    private Person responsible;
    private Address address;

    // Getters and setters.

    // This is my real problem. I removed it and the mapper worked.
    public IPerson getFather() {
        if (father == null) father = new Person();
        return father; 
    }
} 

PersonDTO类:

public class StudentDTO extends PersonDTO {

    private PersonDTO financialResponsible;

    // Getters and setters.
}

以下是条件的示例:

public class PersonDTO {

    private Long id;
    private String name;
    private PersonDTO father;
    private PersonDTO mother;
    private PersonDTO responsible;
    private AddressDTO address;

    // Getters and setters.

}

希望对您有帮助