razyInitializationException ajax / json&mappingjacksonを使用したスプリングMVCを使用して

StackOverflow https://stackoverflow.com/questions/4377829

質問

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;

すべて順調。私はすべての人とハッシュセットを持っています。より多くのステップをデバッグすると、私はこの行に来ます:

this.objectMapper.writeValue(jsonGenerator, o);

org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

それから私はソースコードを見ませんが、私のデバッガーは私に言っています:

StdSerializerProvider._serializeValue(JsonGenerator, Object) line 297

この行の後、エラーが発生します。

ERROR: org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: com.mydomain.project.dom.Person.projects, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.mydomain.project.dom.Person.projects, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
    at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:339)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:314)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:112)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:160)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:131)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:363)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:314)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:112)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:297)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1030)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)
    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:181)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:975)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:933)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:882)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:428)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:619)

それは、シリアル化 /ジャクソンマッピングと関係があるようです。それは、必要ではなく、通常はゆっくりとロードされている人の関連するプロジェクトを取得したいと考えています。

ここでの問題は何ですか?

よろしくお願いします。よろしくお願いします。

役に立ちましたか?

解決

あなたが遭遇することはこれに似ています:怠zyな読み込みエラー

一言で言えば、冬眠セッションの外で怠zyなコレクションにアクセスしています。

可能な解決策:

  • 熱心に取ります
  • コレクションにアクセスする時点で、冬眠セッションがまだ開いていることを確認してください。 OpenSessionInviewフィルターを使用できます。 Hibernateはトランザクションを閉鎖するセッションを終了する可能性があるため、それ自体では十分ではないかもしれません。したがって、トランザクションスコープを拡張するか、冬眠を防ぐための方法を見つけて、トランザクションの終了時にセッションを終了する必要があります。
  • トランザクション内の怠zyなロードコレクションにアクセスして、冬眠がロードされるようにしてください。

詳細については、上記の投稿を確認してください。

私が理解したことから更新すると、これはジャクソンマッパーが完全にロードされていないモデルを受け取ったことによって引き起こされます(一部のコレクションは怠zyなロードされています)。ジャクソンがマッピングするためにそれらのコレクションのオブジェクトは必要ないと言っています。私が見ている代替案は次のとおりです。

  • ジャクソンに、ジャクソンとマップする情報のみを含む、あなたの個人オブジェクトに基づいて作成された正しいモデル、シンプルなポジョスを提供します。したがって、ジャクソンに人のリストを与える代わりに、あなたはそれにパーソナルデテールのリストを与える(またはあなたがそれらに電話したい)
  • そのコレクションを無視するようにジャクソンを構成する - それが可能かどうかわからない

お役に立てれば。

他のヒント

これは簡単なことをすぐに助けませんが、新しいジャクソン関連のプロジェクトがあることを知っておくと良いかもしれません。 ジャクソンモジュール陽性 (Githubで)これは、この問題を他の一般的に問題のあるユースケースとともに解決することを目指しています。

しかし、短期的には、この記事が便利だと思うかもしれません。 http://kyrill007.livejournal.com/2577.html

hibernate関係にリンクされているフィールドをJSONオブジェクトにマッピングしたくない場合は、モデルクラスに「@jsonignore」を追加できます。

@JsonIgnore
@OneToMany(mappedBy = "person")
private List<ProjectEntity> projects = new ArrayList<ProjectEntity>();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top