当前位置: 首页 > 知识库问答 >
问题:

Modelmapper循环映射

姜俊民
2023-03-14

我有一个父类和子类,其各自的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
}    

当我试图将父映射到父映射到父映射到父映射时,我得到了堆栈溢出错误。

请帮我解决这个问题。

共有1个答案

宋运锋
2023-03-14

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

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

最近我遇到了这样的问题。在我的情况下,我有一个类学生,扩展人。人还有三种人的属性:父亲、母亲和责任。以防万一,我有一个循环关系。当我运行我的JUnits测试时,我收到了一个循环调用。我没有stakOverflow,因为Spring(过了一段时间)关闭了数据库连接。

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

解决此问题的另一种方法是在映射器中添加条件。您可以在这里阅读更多有关条件的信息。例如,您可以设置一些条件:“如果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.
}

个人类别:

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 condithtml" target="_blank">ions 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));

我希望能对你有所帮助/

 类似资料:
  • 我与ModelMapper框架有麻烦。请解释为什么我看到以下行为。 我在build.gradle有以下依赖性 和一个类客户: 我还有一个地图绘制工具: 还有一个测试 在fred()中,方法输出是非红色的“Customer{name=fred,age=40}”(“Customer{name=null,age=40}”)。你能解释一下为什么吗?为什么我在第一个方法中看不到输出“George”?

  • 我使用DTO和modelMapper是为了不让某些字段可见。我有一个类别实体,可以有子类别 创建类别时,我使用模型: 在此模型中,我希望parentCategoryKeyId与父对象的categoryKeyId匹配。 例如,如果我创建了一个“顶级”类别: 它返回给我: 当我这样做时: 在我的控制器中,我将其余对象传递给DTO层,该层调用服务: 我的类别是基本的POJO: 为我服务: 我的问题是,我

  • 问题内容: 我正在寻找一种确定范围的方法 。 Golang规范指出以下内容: 未指定地图的迭代顺序,并且不能保证每次迭代之间都相同。如果在迭代过程中删除尚未到达的映射条目,则不会生成相应的迭代值。如果映射条目是在迭代过程中创建的,则该条目可能在迭代过程中产生或可以被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能有所不同。如果映射为nil,则迭代次数为0。 我在StackOverflo

  • 在映射上分配一些默认值 我知道我需要在地图中添加值 问题是我的循环不起作用。我需要从地图中添加value2,基于从那里的位置或从地图中添加value2

  • 我目前正在尝试使用ModelMapper的映射方法执行实体到DTO的映射。在最深的属性映射上,映射结果为null,但它应该是一个对象。 以下是我的映射源实体(省略brevety的Loombok getter和setter): 以下是我的目标DTO(省略brevety的Loombok Getter和Setter): 在我的Controller类方法上,我这样做映射: My clientService

  • 问题内容: 我有一个包含循环的对象图。我如何让JAXB处理呢?我尝试在子类中使用批注,但JAXB编组器仍检测到周期。 问题答案: 使用JAXB的好处是它是具有多个实现的标准运行时(就像JPA一样)。 如果使用EclipseLink JAXB(MOXy),则可以使用许多扩展来处理JPA实体,包括双向关系。这是使用MOXy @XmlInverseReference批注完成的。它的作用类似于元帅上的@X