I’m trying to define tree structure in the database. It’s about certain groupings of services. This means that a group can have a parent if it is a subnode, otherwise it has no parent. The services have a certain group stored as a foreign key, but this is probably irrelevant to the question.
The OneToMany relationship works, but I only get my response without the children. That only means if I add a @JsonIgnore to the children. But for me it would be optimal to get the data with the children.
If @JsonIgnore is missing an error message is thrown:
<code>2024-05-08T08:35:52.964+02:00 WARN 28612 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.checkCommitted(ResponseFacade.java:503) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
2024-05-08T08:35:52.972+02:00 ERROR 28612 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] with root cause
java.lang.StackOverflowError: null
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027) ~[na:na]
<code>2024-05-08T08:35:52.964+02:00 WARN 28612 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.checkCommitted(ResponseFacade.java:503) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
...
2024-05-08T08:35:52.972+02:00 ERROR 28612 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] with root cause
java.lang.StackOverflowError: null
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027) ~[na:na]
...
</code>
2024-05-08T08:35:52.964+02:00 WARN 28612 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.checkCommitted(ResponseFacade.java:503) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
...
2024-05-08T08:35:52.972+02:00 ERROR 28612 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] with root cause
java.lang.StackOverflowError: null
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027) ~[na:na]
...
Here is my code (without @JsonIgnore):
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private ServiceGroup parent;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private List<ServiceGroup> children = new ArrayList<ServiceGroup>();
@OneToMany(mappedBy = "group", targetEntity = Service.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Service> services;
<code>...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true, nullable = false)
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private ServiceGroup parent;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private List<ServiceGroup> children = new ArrayList<ServiceGroup>();
@OneToMany(mappedBy = "group", targetEntity = Service.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Service> services;
...
</code>
...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true, nullable = false)
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private ServiceGroup parent;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private List<ServiceGroup> children = new ArrayList<ServiceGroup>();
@OneToMany(mappedBy = "group", targetEntity = Service.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Service> services;
...
I can see the children by debugging. There is only the problem with the response.
Is it possible to receive my response with the children?