java.lang.StackOverflowError 与 jackson json 以及 spring 和 hibernate
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/39984634/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.StackOverflowError with Hymanson json and spring and hibernate
提问by faraa
I have two bidirectional one to many relationship and I get this stackoverflow exception but don't now where and why ? Each event contains one location and more than one session.
我有两个双向的一对多关系,我得到了这个 stackoverflow 异常,但现在不知道在哪里以及为什么?每个事件包含一个地点和多个会话。
@Entity
@Table(name = "session")
public class Session {
@Id
@Column(name = "idsession")
int idsession;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "idevent")
Event event ;
.
.
.
}
event.java
事件.java
@Entity
@Table(name="event")
public class Event {
@Column(name = "idevent")
@Id
private int idevent;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "idevent")
private List<Session> sessions = new ArrayList<Session>();
}
location.java
位置.java
@Entity
@Table(name="location")
public class Location {
@Id
@Column(name = "idlocation" )
@OneToOne
@JoinColumn(name = "idevent")
private Event event;
}
controller
控制器
@RequestMapping(value="/events", method=RequestMethod.GET)
public @ResponseBody
List<Event> events() {
return eventService.getAllEvents() ;
}
Edit:
编辑:
EventDaoImpl that eventService uses it.
@Repository
@Transactional(readOnly = true)
public class EventDaoImpl implements EventDao {
@Autowired
private SessionFactory sessionFactory;
@Override
public List<Event> getAllEvents() {
Session session = sessionFactory.openSession();
String hql = "FROM Event";
Query query = session.createQuery(hql);
List<Event> eventList = query.list();
System.err.print("lengthhh" + eventList.size());
return eventList;
}
}
exception trace :
异常跟踪:
Handling of [org.springframework.http.converter.HttpMessageNotWritableException] resulted in Exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:501)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.sendServerError(DefaultHandlerExceptionResolver.java:313)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(DefaultHandlerExceptionResolver.java:370)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:140)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1167)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1004)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
]]
[2016-10-11T22:40:22.158+0330] [glassfish 4.1] [WARNING] [] [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] [tid: _ThreadID=27 _ThreadName=http-listener-1(1)] [timeMillis: 1476213022158] [levelValue: 900] [[
Handling of [org.springframework.http.converter.HttpMessageNotWritableException] resulted in Exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:501)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.sendServerError(DefaultHandlerExceptionResolver.java:313)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(DefaultHandlerExceptionResolver.java:370)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:140)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1167)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1004)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
]]
[2016-10-11T22:40:22.162+0330] [glassfish 4.1] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=27 _ThreadName=http-listener-1(1)] [timeMillis: 1476213022162] [levelValue: 900] [[
StandardWrapperValve[mvc-dispatcher]: Servlet.service() for servlet mvc-dispatcher threw exception
java.lang.StackOverflowError
at java.lang.Exception.<init>(Exception.java:66)
at java.io.IOException.<init>(IOException.java:58)
at com.fasterxml.Hymanson.core.JsonProcessingException.<init>(JsonProcessingException.java:27)
at com.fasterxml.Hymanson.core.JsonProcessingException.<init>(JsonProcessingException.java:46)
at com.fasterxml.Hymanson.databind.JsonMappingException.<init>(JsonMappingException.java:149)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:658)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.Hymanson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
at com.fasterxml.Hymanson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.Hymanson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
Problem Solved:
问题解决了:
Problem solved with adding "JsonIgnore" for two fields that have bidirectional relationship....@onetoOne and @OneToMany
为具有双向关系的两个字段添加“JsonIgnore”解决的问题....@onetoOne 和 @OneToMany
回答by hetec
I would suppose that there is a cyclic reference during the json serialization. So if you start to serialize your session object to json which contains the event field, Hymanson tries to serialize the referenced event object, too. The problem is that the event object itself references the session object. So if Hymanson reaches the session field in the event object it tries to serialize the session object again. This will end up in an infinity loop and result in a stack overflow error.
我认为在 json 序列化过程中存在循环引用。因此,如果您开始将会话对象序列化为包含事件字段的 json,Hymanson 也会尝试序列化引用的事件对象。问题是事件对象本身引用了会话对象。因此,如果 Hymanson 到达事件对象中的会话字段,它会尝试再次序列化会话对象。这将在无限循环中结束并导致堆栈溢出错误。
So you need to exclude on of the two fields (session or event) from the serialization process by using the @JsonIgnore annotation or the like. Which field to exclude from which class depends on your application needs because it would influence the structure of the generated json.
因此,您需要使用 @JsonIgnore 注释等从序列化过程中排除两个字段(会话或事件)中的一个。从哪个类中排除哪个字段取决于您的应用程序需要,因为它会影响生成的 json 的结构。
回答by Gergely Bacso
Your error (your stacktrace confirms this) is a result of the Hymanson serialization trying to resolve a reference circlebetween your Event
and Session
class. Most serialization frameworks need some hint from you to resolve these circular references, otherwise they will end up:
您的错误(您的堆栈跟踪证实了这一点)是Hyman逊序列化试图解决您Event
和Session
班级之间的参考圈的结果。大多数序列化框架需要你的一些提示来解决这些循环引用,否则它们最终会:
- Serializing Event "A"
- Serializing all Sessions of Event "A"
- Serializing parent of first session, which is Event "A"
- Serializing Event "A" again...
- 序列化事件“A”
- 序列化事件“A”的所有会话
- 序列化第一个会话的父级,即事件“A”
- 再次序列化事件“A” ...
What you should do this breaking this cycle by directing the serializer to ignore the parent object, for this you can use:
您应该通过指示序列化程序忽略父对象来打破这个循环,为此您可以使用:
@JsonIgnore
A specific stackoverflow question dealing with the same topic:
Json and Java - Circular Reference
处理同一主题的特定 stackoverflow 问题:
Json and Java - Circular Reference