So verwalten Sie zirkuläre Abhängigkeiten beim Erstellen von DTOs für meine EntitätJava

Java-Forum
Guest
 So verwalten Sie zirkuläre Abhängigkeiten beim Erstellen von DTOs für meine Entität

Post by Guest »

Ich arbeite an einer Spring Boot-Anwendung und versuche, eine Antwort von meinem Controller zu senden.
Ich habe zwei Entitäten, „POST“ und „TAG“ mit einem Viele-zu-viele-Beziehung. Vereinfachtes Beispiel:

Code: Select all

@Entity
public class Post{
private String title;

@ManyToMany(...)
Set tags;
}
und

Code: Select all

@Entity
public class Tag{
private String name;

@ManyToMany(...)
Set posts;
Nehmen wir an, ich erstelle DTO-Klassen für diese beiden

Code: Select all

@Builder
//...
public class PostDTO{
private String title;
Set tags;
}

Code: Select all

@Builder
//...
public class TagDTO{
private String name;
Set post;
}
Versuch:
Sagen wir, ich habe eine Klasse, die eine Post-Entität einem PostDTO zuordnet

Code: Select all

public class mapper{
public PostDTO mapToPostDTO(Post post){
Set tagDTOs = new HashSet();
post.getTags().stream().forEach(tag->tagDTOs.add(mapTotagDTO(Tag)));
return PostDTO.builder()
.title(post.getTitle())
.tags(tagDTOs)
.build();

}

private TagDTO mapToTagDTO(Tag tag){ //Intentionally skip the Set field
return  TagDTO.builder()
.name(tag.getName())
.build()
}
Dies scheint jedoch eine gefährliche Vorgehensweise zu sein und könnte zu unerwarteten Ergebnissen führen. Daher besteht meine Alternative darin, einfache DTOs zu erstellen, die nicht auf andere DTOs abgebildet werden können.
Zum Beispiel:

Code: Select all

@Builder
//...
public class SimpleTagDTO{
private String name;
}
PostDTO aktualisiert

Code: Select all

@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
Wenn ich jetzt meine Mapper-Funktion erstelle, kann ich Folgendes tun:

Code: Select all

public class mapper{
public PostDTO mapToPostDTO(Post post){
Set setTags = new HashSet();
post.getTags().stream().forEach(tag->setTags.add(mapToSimpleTagDTO(tag)));
return PostDTO.builder()
.title(post.getTitle())
.tags(setTags)
.build();

}

private SimpleTagDTO mapToSimpleTagDTO(Tag tag){
return SimpleTagDTO.builder()
.name(tag.getName());
}
}
Das kommt mir wie ein übertriebener Ansatz vor und ich weiß nicht, wie ich das lösen kann. Es gibt einen anderen Beitrag, in dem jemand die Verwendung von @JsonBackReference und @JsonManagedReference erwähnt, aber dann habe ich Angst, dass dies den „Anführer“ der Beziehung (?) binden wird; Das heißt, ich kann ein PostDTO mit einer Liste von TagDTOs senden, habe aber möglicherweise Probleme beim Senden von TagDTOs mit einer Liste von PostDTOs?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post