Суть в том, что есть неких 2 класса А и Б. Поскольку есть отношение, то соответственно класс А ссылается на Б и наоборот. Для обоих классов есть DTO и JPA реализация. Есть соответственно маппер для всего этого дела (в моём случае в конструкторе, но не столь важно). И получается следующая ситуация с маппингом: вызываем маппер А_DTO в А_JPA, в следствии чего для поля Б_DTO вызывается Б_DTO в Б_JPA, у которого в свою очередь есть поле А_DTO и так далее, в следствии чего выпадает stack overflow и все падает. Как избавиться от подобной зависимости? Пример кода (аннотации и лишние поля убрал, ломбок стоит):
public abstract class Template implements Serializable {
protected Template(Template templateFrom) {
setTemplateGroup(templateFrom.getTemplateGroup());
}
public abstract TemplateGroup getTemplateGroup();
public abstract void setTemplateGroup(TemplateGroup template);
}
public class TemplateDTO extends Template {
private TemplateGroup templateGroup;
public TemplateDTO(Template templateFrom) {
super(templateFrom);
}
public TemplateGroup getTemplateGroup() {
return templateGroup;
}
}
public class TemplateJPA extends Template {
private TemplateGroupJPA templateGroup;
public TemplateJPA(Template templateFrom) {
super(templateFrom);
}
@Override
public void setTemplateGroup(TemplateGroup templateGroup) {
if (templateGroup == null) {
this.templateGroup = null;
return;
}
this.templateGroup = new TemplateGroupJPA(templateGroup);
}
}
////////////////////////////////////////
public abstract class TemplateGroup implements Serializable {
protected TemplateGroup(TemplateGroup from) {
setTemplates(from.getTemplates());
}
public abstract Set<Template> getTemplates();
public abstract void setTemplates(Set<Template> templates);
}
public class TemplateGroupDTO extends TemplateGroup {
private Set<TemplateDTO> templates;
public TemplateGroupDTO(TemplateGroup from) {
super(from);
}
@Override
public Set<Template> getTemplates() {
return (templates == null) ? null : new HashSet<>(templates);
}
@Override
public void setTemplates(Set<Template> templates) {
this.templates = (templates == null) ? null
: templates.stream().map(TemplateDTO::new).collect(Collectors.toSet());
}
}
public class TemplateGroupJPA extends TemplateGroup {
private Set<TemplateJPA> templates;
public TemplateGroupJPA(TemplateGroup from) {
super(from);
}
@Override
public Set<Template> getTemplates() {
return (templates == null) ? null : new HashSet<>(templates);
}
@Override
public void setTemplates(Set<Template> templates) {
this.templates = templates.stream().map(TemplateJPA::new).collect(Collectors.toSet());
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Почему не работает автообновление? Зацикливается обновление minCSS