Spring Boot – So verwalten Sie zirkuläre Abhängigkeiten beim Erstellen von DTOs für meine Entität

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Spring Boot – So verwalten Sie zirkuläre Abhängigkeiten beim Erstellen von DTOs für meine Entität

by Guest » 03 Jan 2025, 11:10

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()
}

Wie all dies wie eine gefährliche Praxis aussieht und zu unerwarteten Ergebnissen führen kann, daher besteht meine Alternative darin, einfache DTOs zu erstellen nicht anderen DTOs zuordnen
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 fühlt sich wie ein übertriebener Ansatz an und ich kann nicht herausfinden, wie ich das lösen kann.
Es gibt einen anderen Beitrag, in dem jemand die Verwendung von @JsonBackReference erwähnt @JsonManagedReference, aber dann habe ich Angst, dass dadurch der „Anführer“ der Beziehung gebunden wird (?). Das heißt, ich kann ein PostDTO mit einer Liste von TagDTOs senden, aber möglicherweise Probleme beim Senden von TagDTOs mit einer Liste von PostDTOs..?
Jede Hilfe ist willkommen, danke

Top