この投稿が古いことは承知していますが、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 /