2012-01-02 2 views
2

私はデータベースからコンテンツを怠惰に取得するためにhibernateを使用しています。 このコンテンツはjson出力にシリアライズされますが、問題はジャンクソンが休止状態から取得した「persistentBag」のゲッターを呼び出し、「セッションまたはセッションが閉じられませんでした」という例外です。私はジャクソンをお伝えしたいと思います実際にjsonsonからjsonを除いたシリアルシームレス

これを達成するための最良の方法は何ですか?「リストがロードされていない場合(それはpersistentBagだ場合意味は)それを連載していませんか」 persistentBagをシリアライゼーションから除外するためのジャックソンの設定は? リフレクションAPIを使用してpersistentBagを新しい空のリストに設定する必要がありますか?

ベストは何ですか?ありがとう、幸せな新年の男!

答えて

0

@JsonIgnoreを使用して、マークされたプロパティを完全に無視することができます。注釈賢明な私は "もしlodaded"オプションがあるとは思わない。

あなたはもちろん、タイプをチェックし、どのように進めるかを決める独自のマーシャラーを書くことができます。

カスタム・シリアライザはあなたに完全に制御することができますが、もう少し、もちろんされていることを

@JsonSerialize(using = PropertyValueSerializer.class) 
@JsonDeserialize(using = PropertyValueDeserializer.class) 
public class PROPERTY_VALUE implements Serializable{ 

    private String key; 
    private String value; 

:その後、いくつかの注釈を追加することによって、その型をシリアル化するために使用されるカスタムデータ型

public class PropertyValueSerializer extends JsonSerializer<PROPERTY_VALUE> { 

    @Override 
    public void serialize(PROPERTY_VALUE property_value, JsonGenerator jsonGenerator, 
          SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 

     jsonGenerator.writeStartObject(); 
     jsonGenerator.writeFieldName(property_value.getKey()); 
     jsonGenerator.writeString(property_value.getValue()); 
     jsonGenerator.writeEndObject(); 
    } 
} 

のために書かれたシリアライザ単純な注釈だけでは実現できません。

+0

ありがとうございました。私がよく理解すれば、キーと値のプロパティを持つ独自のpersistentBagを作成する必要があります。休止状態のpersistentBagの代わりに、私はデータベース結果のために自分自身を取得する必要があります(深刻なハックがなければ不可能です)。次に、私はカスタム・マーシャラーでプロセスのシリアライズを処理する方法を指定できます。 – Mostrapotski

+0

リフレクションを使用するのが簡単ではないのは、私の微調整されたpersistentBagを使って休止状態にする方法がわからないからです。 – Mostrapotski

+0

いいえ、永続的なバッグを作るのではなく、永続的なバッグを持っているタイプそれらがアクセス可能であり、したがってシリアル化されているかどうかを確認することができます。 –

0

私は最初にJackson Hibernate moduleを調べます。これは、遅延ロードの処理など、いくつかのHibernate固有のもののサポートを追加するためです。 まだ拡張されていないコレクションの出力を無効にすることができます。これは、必要に応じてコレクションを遅延ロードする方法をすでに知っているからです。

また、一般的にはあなたはそれが、少なくとも一つの要素を持っている場合にのみ一致するプロパティを追加しますどの

@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY) 

を使用して、空のコレクションの出力を防ぐことができます。

+0

これは知っておくと良いヒントですが、何とかCollection.isEmptyを呼び出さなければなりません。休止状態のセッションがなくなり、例外が発生するため、これは嫌です。しかし、まだ知っていいです、ありがとう – Mostrapotski

+0

Ok。はい、それはある形か別の形で空の知識を必要とするので、問題があるかもしれません。 – StaxMan

関連する問題