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

この投稿が古いことは承知していますが、Google から誰かがここに到着した場合に備えて、1 つの回答を提供しようとします。

おそらく、動的オブジェクトの作成があります。

最近、私はこのような問題を抱えていました。私の場合、Person を拡張するクラス Student があります。Person には、Person 型の他の 3 つの属性があります。父、母、責任者です。場合によっては、循環関係がありました。JUnits テストを実行すると、循環呼び出しが発生しました。Spring が (しばらくしてから) データベース接続を閉じるため、stakOverflow を取得できませんでした。

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

StudentDTO クラス:

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 に答える