1

FlexJSON を使用して JPA/Hibernate エンティティをシリアル化しようとすると、非常に奇妙なエラーが発生します。オブジェクト自体は派手なものではありません。フィールドと他のオブジェクト間の関係だけです。

Caused by: flexjson.JSONException: Error trying to deepSerialize
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:61)
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22)
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:49)
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22)
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:49)
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22)
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:49)
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22)
    at flexjson.JSONContext.transform(JSONContext.java:73)
    at flexjson.JSONSerializer.serialize(JSONSerializer.java:377)
    at flexjson.JSONSerializer.serialize(JSONSerializer.java:235)

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at flexjson.BeanProperty.getValue(BeanProperty.java:102)
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:37)
    ... 89 more
Caused by: java.lang.IllegalStateException: Cannot call isReadOnlyBeforeAttachedToSession when isReadOnlySettingAvailable == true
at org.hibernate.proxy.AbstractLazyInitializer.isReadOnlyBeforeAttachedToSession(AbstractLazyInitializer.java:308

他の(まばらな)投稿を読んでコードを見ると、これは遅延初期化の問題のようです。これは非常に少数のケースで繰り返し発生しますが、これらのケースは再現可能です。私の推測では、ステートフルなように見えるので、データに関係していますが、特に非常にまれであるため、データがこの種の例外を引き起こす理由が本当にわかりません。

4

2 に答える 2

3

おそらく、エンティティ オブジェクトには、アクセス時にのみデータベースからの値が入力される「遅延ロード」プロパティがあります。また、休止状態セッションが滅菌 (そのプロパティへのアクセス) の時点で既に閉じられている場合は、遅延初期化例外が発生します。

この例外を取り除くには、おそらく次のいずれかを行う必要があります。

  • 遅延ロードされたプロパティ (シリアル化) へのアクセス時に休止状態セッションが閉じられていないことを確認します。
  • セッションが閉じられた場合でもデータベースへのアクセスが必要ないように、セッションが閉じられる前に遅延ロードされたプロパティを初期化します
  • それらを「遅延ロード」しないようにする
  • 遅延ロードされたプロパティをまったくシリアライズしないでください
于 2012-12-06T22:12:10.580 に答える
0

それを解決するために私が経験した最善のことは、深いシリアル化を行う前に、Bean、リスト、マップ、またはシリアル化するデータなどのデータを HashMap に入れ、その HashMap を深くシリアル化しようとすることです。トリックが 100% 機能していることがわかります。

サイード・シャザド

于 2015-03-11T15:05:49.303 に答える