我正在使用 Spring MVC、AJAX/JSON 和 Hibernate 从 MySQL 数据库中获取所有人。我编写了 JUnit 集成测试来验证我的服务,一切正常。
现在我这样称呼它:
@RequestMapping(value="/allpersons", method=RequestMethod.GET)
public @ResponseBody Set<Person> getAllPersons() {
Set<Person> persons= new PersonServiceImpl().getAllPersons();
return persons;
}
我调试了它。该行与
return persons;
一切都很好。我有一个包含所有人的 HashSet。调试更多步骤,我来到这一行:
this.objectMapper.writeValue(jsonGenerator, o);
在
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
然后我看不到源代码,但我的调试器告诉我:
StdSerializerProvider._serializeValue(JsonGenerator, Object) line 297
在这一行之后,我收到错误:
错误:org.hibernate.LazyInitializationException - 无法延迟初始化角色集合:com.mydomain.project.dom.Person.projects,没有会话或会话已关闭 org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.mydomain.project.dom.Person.projects,没有会话或会话已关闭 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 在 org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) 在 org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) 在 org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186) 在 org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:339) 在 org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:314) 在 org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:112) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268) 在 org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:160) 在 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:131) 在 org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:363) 在 org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:314) 在 org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:112) 在 org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:297) 在 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224) 在 org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1030) 在 org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153) 在 org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:181) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:975) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:933) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:882) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:428) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) 在 org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) 在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) 在 org.tukey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195) 在 org.tukey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159) 在 org.tukey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141) 在 org.tukey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90) 在 org.tukey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 在 java.lang.Thread.run(Thread.java:619)
看来,这与序列化/杰克逊映射有关。它想要获取一个人的相关项目,这些项目是不需要的,它们通常是懒加载的。
这里有什么问题?
提前感谢您和最诚挚的问候。