by Anonymous » 12 Mar 2025, 11:59
Ich versuche eine Anwendung zu treffen, bei der der Benutzer auf Post reagieren kann, und ich habe Probleme mit der Beziehung zwischen den Nachrichten (Posts) und Reaktionen. Wenn ich versuche, auf einen Beitrag zu reagieren, gibt es mir einen Stackoverflowerror < /p>
News.java
Code: Select all
@Data
@Entity
@Table(name = "News")
public class News {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "update_type")
private String updateType;
@Column(name = "created_at")
private Date createdAt;
private String title;
private String intro;
@Column(name = "thumbnail_url")
private String thumbnailUrl;
@Column(name = "image_url")
private String imageUrl;
private String description;
@Column(name = "news_id")
private Long newsId;
private int snaps;
private String location;
@JsonManagedReference
@OneToMany(mappedBy="news", cascade = CascadeType.ALL)
Set newsReactions;
public boolean hasReaction(String reactionName) {
return newsReactions.stream()
.map(newsReaction -> newsReaction.getReactions().getName())
.anyMatch(name -> name.toLowerCase().contains(reactionName));
}
public void addNewReaction(Reactions reactions) {
newsReactions.add(new NewsReactions(this, reactions));
}
public void addReaction(Reactions reactions) {
List newsReactionsList = newsReactions.stream()
.filter(nr -> nr.getReactions().getName().toLowerCase().contains(reactions.getName()))
.toList();
if(!newsReactionsList.isEmpty()) {
newsReactionsList.getFirst().count++;
} else {
addNewReaction(reactions);
}
}
< /code>
reactions.java
@NoArgsConstructor
@Data
@Entity
@Table(name = "Reactions")
public class Reactions {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "reaction_id")
private Long id;
private String name;
@JsonIgnore
@OneToMany(mappedBy="reactions", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
Set newsReactions;
}
< /code>
Reactionsdto.java
@Data
public class ReactionsDto {
String name;
}
< /code>
Newsreactions.java
@Data
@Entity
@NoArgsConstructor
public class NewsReactions {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@ToString.Exclude
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="news_id")
News news;
@ToString.Exclude
@JsonIgnore
@ManyToOne
@JoinColumn(name="reactions_id")
Reactions reactions;
@Column
int count;
public NewsReactions(News news, Reactions reactions) {
this.news = news;
this.reactions = reactions;
count = 1;
}
< /code>
API-Route, um auf einen Newscontroller.java < /p>
zu reagieren, um zu reagieren. @PutMapping("/news/{id}/reactions")
public ResponseEntity reactToNews(@PathVariable("id") Long id, @RequestBody ReactionsDto reactionsDto) throws ReactionsNotFoundException, NewsNotFoundException {
News news = newsService.getById(id).orElse(null);
if(news != null) {
Reactions reactions = reactionsService.getByName(reactionsDto.getName()).orElse(null);
if(reactions != null) {
news.addReaction(reactions);
newsService.save(news);
return ResponseEntity
.created(URI.create("/news/"+reactions.getId()+"/reactions"))
.body(reactions);
}
throw new ReactionsNotFoundException("Reaction not found");
}
throw new NewsNotFoundException("Couldn't find the news");
}
< /code>
Stack Trace < /p>
2025-03-10T15:02:08.101+01:00 ERROR 95629 --- [apiwyldernews] [nio-3000-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.RuntimeException: java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
at java.base/java.lang.Long.hashCode(Long.java:1440) ~[na:na]
at java.base/java.lang.Long.hashCode(Long.java:1428) ~[na:na]
at com.cloakstudio.apiwyldernews.model.News.hashCode(News.java:13) ~[classes/:na]
at com.cloakstudio.apiwyldernews.model.NewsReactions.hashCode(NewsReactions.java:10) ~[classes/:na]
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na]
at org.hibernate.collection.spi.PersistentSet.hashCode(PersistentSet.java:410) ~[hibernate-core-6.6.8.Final.jar:6.6.8.Final]
at com.cloakstudio.apiwyldernews.model.News.hashCode(News.java:13) ~[classes/:na]
at com.cloakstudio.apiwyldernews.model.NewsReactions.hashCode(NewsReactions.java:10) ~[classes/:na]
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na]
at org.hibernate.collection.spi.PersistentSet.hashCode(PersistentSet.java:410) ~[hibernate-core-6.6.8.Final.jar:6.6.8.Final]
at com.cloakstudio.apiwyldernews.model.News.hashCode(News.java:13) ~[classes/:na]
at com.cloakstudio.apiwyldernews.model.NewsReactions.hashCode(NewsReactions.java:10) ~[classes/:na]
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na]
at org.hibernate.collection.spi.PersistentSet.hashCode(PersistentSet.java:410) ~[hibernate-core-6.6.8.Final.jar:6.6.8.Final]
Ich versuche eine Anwendung zu treffen, bei der der Benutzer auf Post reagieren kann, und ich habe Probleme mit der Beziehung zwischen den Nachrichten (Posts) und Reaktionen. Wenn ich versuche, auf einen Beitrag zu reagieren, gibt es mir einen Stackoverflowerror < /p>
News.java
[code]@Data
@Entity
@Table(name = "News")
public class News {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "update_type")
private String updateType;
@Column(name = "created_at")
private Date createdAt;
private String title;
private String intro;
@Column(name = "thumbnail_url")
private String thumbnailUrl;
@Column(name = "image_url")
private String imageUrl;
private String description;
@Column(name = "news_id")
private Long newsId;
private int snaps;
private String location;
@JsonManagedReference
@OneToMany(mappedBy="news", cascade = CascadeType.ALL)
Set newsReactions;
public boolean hasReaction(String reactionName) {
return newsReactions.stream()
.map(newsReaction -> newsReaction.getReactions().getName())
.anyMatch(name -> name.toLowerCase().contains(reactionName));
}
public void addNewReaction(Reactions reactions) {
newsReactions.add(new NewsReactions(this, reactions));
}
public void addReaction(Reactions reactions) {
List newsReactionsList = newsReactions.stream()
.filter(nr -> nr.getReactions().getName().toLowerCase().contains(reactions.getName()))
.toList();
if(!newsReactionsList.isEmpty()) {
newsReactionsList.getFirst().count++;
} else {
addNewReaction(reactions);
}
}
< /code>
reactions.java
@NoArgsConstructor
@Data
@Entity
@Table(name = "Reactions")
public class Reactions {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "reaction_id")
private Long id;
private String name;
@JsonIgnore
@OneToMany(mappedBy="reactions", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
Set newsReactions;
}
< /code>
Reactionsdto.java
@Data
public class ReactionsDto {
String name;
}
< /code>
Newsreactions.java
@Data
@Entity
@NoArgsConstructor
public class NewsReactions {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@ToString.Exclude
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="news_id")
News news;
@ToString.Exclude
@JsonIgnore
@ManyToOne
@JoinColumn(name="reactions_id")
Reactions reactions;
@Column
int count;
public NewsReactions(News news, Reactions reactions) {
this.news = news;
this.reactions = reactions;
count = 1;
}
< /code>
API-Route, um auf einen Newscontroller.java < /p>
zu reagieren, um zu reagieren. @PutMapping("/news/{id}/reactions")
public ResponseEntity reactToNews(@PathVariable("id") Long id, @RequestBody ReactionsDto reactionsDto) throws ReactionsNotFoundException, NewsNotFoundException {
News news = newsService.getById(id).orElse(null);
if(news != null) {
Reactions reactions = reactionsService.getByName(reactionsDto.getName()).orElse(null);
if(reactions != null) {
news.addReaction(reactions);
newsService.save(news);
return ResponseEntity
.created(URI.create("/news/"+reactions.getId()+"/reactions"))
.body(reactions);
}
throw new ReactionsNotFoundException("Reaction not found");
}
throw new NewsNotFoundException("Couldn't find the news");
}
< /code>
Stack Trace < /p>
2025-03-10T15:02:08.101+01:00 ERROR 95629 --- [apiwyldernews] [nio-3000-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.RuntimeException: java.lang.StackOverflowError] with root cause
java.lang.StackOverflowError: null
at java.base/java.lang.Long.hashCode(Long.java:1440) ~[na:na]
at java.base/java.lang.Long.hashCode(Long.java:1428) ~[na:na]
at com.cloakstudio.apiwyldernews.model.News.hashCode(News.java:13) ~[classes/:na]
at com.cloakstudio.apiwyldernews.model.NewsReactions.hashCode(NewsReactions.java:10) ~[classes/:na]
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na]
at org.hibernate.collection.spi.PersistentSet.hashCode(PersistentSet.java:410) ~[hibernate-core-6.6.8.Final.jar:6.6.8.Final]
at com.cloakstudio.apiwyldernews.model.News.hashCode(News.java:13) ~[classes/:na]
at com.cloakstudio.apiwyldernews.model.NewsReactions.hashCode(NewsReactions.java:10) ~[classes/:na]
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na]
at org.hibernate.collection.spi.PersistentSet.hashCode(PersistentSet.java:410) ~[hibernate-core-6.6.8.Final.jar:6.6.8.Final]
at com.cloakstudio.apiwyldernews.model.News.hashCode(News.java:13) ~[classes/:na]
at com.cloakstudio.apiwyldernews.model.NewsReactions.hashCode(NewsReactions.java:10) ~[classes/:na]
at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na]
at org.hibernate.collection.spi.PersistentSet.hashCode(PersistentSet.java:410) ~[hibernate-core-6.6.8.Final.jar:6.6.8.Final]
[/code]