So verwalten Sie zirkuläre Abhängigkeiten beim Erstellen von DTOs für meine Entität
Posted: 03 Jan 2025, 12:27
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:
und
Nehmen wir an, ich erstelle DTO-Klassen für diese beiden
Versuch:
Sagen wir, ich habe eine Klasse, die eine Post-Entität einem PostDTO zuordnet
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:
PostDTO aktualisiert
Wenn ich jetzt meine Mapper-Funktion erstelle, kann ich Folgendes tun:
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?
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;
}
Code: Select all
@Entity
public class Tag{
private String name;
@ManyToMany(...)
Set posts;
Code: Select all
@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
Code: Select all
@Builder
//...
public class TagDTO{
private String name;
Set post;
}
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()
}
Zum Beispiel:
Code: Select all
@Builder
//...
public class SimpleTagDTO{
private String name;
}
Code: Select all
@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
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());
}
}