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
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]@Entity
public class Post{
private String title;
@ManyToMany(...)
Set tags;
}
[/code]
und
[code]@Entity
public class Tag{
private String name;
@ManyToMany(...)
Set posts;
[/code]
Nehmen wir an, ich erstelle DTO-Klassen für diese beiden
[code]@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
[/code]
[code]@Builder
//...
public class TagDTO{
private String name;
Set post;
}
[/code]
Versuch:
Sagen wir, ich habe eine Klasse, die eine Post-Entität einem PostDTO zuordnet
[code]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()
}
[/code]
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]@Builder
//...
public class SimpleTagDTO{
private String name;
}
[/code]
PostDTO aktualisiert
[code]@Builder
//...
public class PostDTO{
private String title;
Set tags;
}
[/code]
Wenn ich jetzt meine Mapper-Funktion erstelle, kann ich Folgendes tun:
[code]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());
}
}
[/code]
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