1

私はSpringMVC、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.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195)で
    org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159)で
    org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)で
    org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)で
    org.tuckey.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)で

それはシリアル化/JacksonMappingと関係があるようです。それは、人の関連するプロジェクトを取得したいのですが、それは必要ではなく、通常は怠惰にロードされます。

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

よろしくお願いします。

4

4 に答える 4

8

遭遇するものはこれと似ています: 遅延読み込みエラー

一言で言えば、Hibernateセッションの外部で遅延ロードされたコレクションにアクセスしています。

可能な解決策:

  • 熱心にそれをフェッチします
  • コレクションにアクセスした時点で、Hibernateセッションがまだ開いていることを確認してください。OpenSessionInViewフィルターを使用できます。Hibernateがトランザクションを終了するセッションを終了する可能性があるため、それ自体では不十分な場合があります。したがって、トランザクションスコープを拡張するか、トランザクションの終了時にHibernateがセッションを閉じないようにする方法を見つける必要があります。
  • Hibernateがコレクションをロードすることを確認するために、トランザクション内の遅延ロードされたコレクションにアクセスすることを確認してください。

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

UPDATE 1私が理解したところによると、これは、Jacksonマッパーが完全にロードされていないモデルを受信したことが原因です(一部のコレクションは遅延ロードされています)。これらのコレクション内のオブジェクトをJacksonによってマップする必要はないと言っています。私が見ている選択肢は次のとおりです。

  • Jacksonに正しいモデル、Personオブジェクトに基づいて作成された単純なPOJOを提供し、Jacksonでマッピングする情報のみを含めます。したがって、JacksonにPersonのリストを提供する代わりに、PersonDetailsのリストを提供します(または、どのように呼び出したい場合でも)
  • そのコレクションを無視するようにJacksonを構成します-それが可能かどうかわからない

お役に立てれば。

于 2010-12-07T15:01:58.100 に答える
2

これは簡単にはすぐには役立ちませんが、他の一般的に問題のあるユースケースとともにこの問題を解決することを目的とした新しいジャクソン関連のプロジェクト、 jackson-module-hibernate (GitHub)があることを知っておくとよいでしょう。

しかし、短期的には、この記事が役立つかもしれません:http: //kyrill007.livejournal.com/2577.html

于 2010-12-10T18:55:32.710 に答える
2

JSONオブジェクトに休止状態でリンクされているフィールドをマッピングしたくない場合は、モデルクラスにアノテーション「@JsonIgnore」を追加できます。

@JsonIgnore
@OneToMany(mappedBy = "person")
private List<ProjectEntity> projects = new ArrayList<ProjectEntity>();
于 2014-09-15T09:21:32.280 に答える
0

これを使って。これは私のために働いています。

Hibernate用のJacksonモジュール、https://github.com/FasterXML/jackson-datatype-hibernate/blob/master/README.md

于 2013-10-30T07:34:45.177 に答える