1

我有各自的 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。

请帮助我解决问题。

4

1 回答 1

0

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

可能您有一个动态对象创建。

最近我遇到了这样的问题。就我而言,我有一个扩展 Person 的 Student 类。Person 具有 Person 类型的其他三个属性:父亲、母亲和责任人。以防万一,我有一个循环关系。当我运行 JUnits 测试时,我收到了循环调用。我没有得到 stakOverflow,因为 Spring(一段时间后)关闭了数据库连接。

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

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

学生班级:

public class Student extends Person implements IStudent {

    private Person financialResponsible;

    // Getters and setters.

}

人物类:

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; 
    }
} 

学生DTO类:

public class StudentDTO extends PersonDTO {

    private PersonDTO financialResponsible;

    // Getters and setters.
}

PersonDTO 类:

public class PersonDTO {

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

    // Getters and setters.

}

以下是条件示例:

...
import org.modelmapper.Condition;
...

    ModelMapper mapper = new ModelMapper();

    // Define STRICT to give high precision on mapper.
    mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

    /*
     * Create conditions to avoid infinity circularity.
     */
    // Condidions.
    final Condition<IStudent, StudentDTO> fatherIsTen = mappingContext -> mappingContext.getSource().getFather().getId() == 10;
    final Condition<IStudent, StudentDTO> motherIsTen = mappingContext -> mappingContext.getSource().getMother().getId() == 10;
    final Condition<IStudent, StudentDTO> resposibleIsTen = mappingContext -> mappingContext.getSource().getResponsible().getId() == 10;

    // Adding conditions on mapper.
    mapper.createTypeMap(IStudent.class, StudentDTO.class) //
       .addMappings(mapper -> mapper.when(fatherIsTen).skip(StudentDTO::setFather))
       .addMappings(mapper -> mapper.when(motherIsTen).skip(StudentDTO::setMother))
       .addMappings(mapper -> mapper.when(resposibleIsTen).skip(StudentDTO::setResponsible));

我希望帮助o /

于 2018-06-20T12:21:13.717 回答