11

MappingJacksonHttpMessageConverter を介して、Hibernate/Spring MVC で jackson 1.9.2 を使用しています。

Jackson は、双方向の 1 対多の関係をシリアル化できず、無限ループになります。

私が使用しているクラスは次のとおりです。

  • SMS インスタンスのセットを持つ会話。

  • 各 SMS インスタンスには一連の PhoneNumbers があります

  • 各 PhoneNumber には親連絡先があります (これは双方向の多対 1 の関係です)

私がやろうとしているのは、会話をシリアル化することです。

@JsonManagedReference@JsonBackReferenceを使用しないと、無限ループのために jackson がクラッシュします。しかし、それらを使用すると、ContactはPhoneNumberにシリアル化されません。

クラス連絡先 {
  @JsonManagedReference
  List<電話番号> phoneNumber ;
}
クラス 電話番号 {
  @JsonBackReference
  お問い合わせ先;
}

出力は次のとおりです。

{ <--------------------- 会話
    "ID": 51,
    "smsSet": [
      {
        "ID": 53,
        "起源": 0123465,
        "目的地": "06533844XY",
        "メッセージ": "ハローワールド!",
        "電話番号": [
          {
            "ID": 64,
            "数値": "06533844XY",
            「作成日」: 1333992533000、
          }
        ]、
      }
    ]、
    「作成日」: 1333992534000
  }

それ以外の

{ <--------- 会話
    "ID": 51,
    "smsSet": [
      {
        "ID": 53,
        "起源": 0123465,
        "目的地": "06533844XY",
        "メッセージ": "ハローワールド!",
        "電話番号": [
          {
            "ID": 64,
            "数値": "06533844XY",
            「作成日」: 1333992533000、
            「連絡先」:--------------------- 欠品
             {
                "ID": 12,
                「名前」:「サミュエル・ジャクソン」、
                "primaryNumber": "06533844XY"
             }
          }
        ]、
      }
    ]、
    「作成日」: 1333992534000
  }
4

4 に答える 4

7

私は最近、同様の問題に遭遇しました: ジャクソン - 二項関係を持つエンティティのシリアル化 (サイクルの回避)

したがって、解決策は、Jackson 2.0 にアップグレードし、クラスに次の注釈を追加することです。

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
                  property = "@id")
public class SomeEntityClass ...

問題は、Spring が Jackson 2.0 で動作しないことです。これは、次の方法で解決されました。

<bean id="jacksonMessageConverter"
          class="own.implementation.of.MappingJacksonHttpMessageConverter"/>

<bean class="org.springframework.web.servlet.mvc
             .annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
        <property name="requireSession" value="false"/>
    </bean>

そして、 own.implementation.of.MappingJacksonHttpMessageConverter はこれに基づいています:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter /json/MappingJacksonHttpMessageConverter.java?format=ok

ただしObjectMapper、Jackson 1 の代わりに、Jackson 2.0 のその他の Jackson クラスを使用してください。*

于 2012-04-11T18:00:32.023 に答える
2

最初の解決策として、これらの注釈を保持し、別のクラスContactWithouPhoneNumberを作成して、それをフィールドとしてPhoneNumberクラスに追加しました。

ここで、レンダリングする前に、PhoneNumberを除くすべてのフィールドをcontactからcontactWithoutPhoneNumberにコピーします。出力JSONには、必要なものがすべて含まれています。

これがDTOデザインパターンです。

于 2012-04-11T06:30:12.987 に答える
0

@JsonIgnoreをフィールドに追加すると、マッパーはシリアル化中にフィールドをスキップします。機能的には@Transientと似ています。

それはjackson-core-aslにあります。

于 2012-09-07T04:16:29.277 に答える
0

クラス定義で間違っていることの 1 つは、 untyped List;の使用です。あなたはむしろ持っているべきです:

List<PhoneNumber> phoneNumber ;

そうしないと、Jackson はデシリアライズ時に型が何であるかを知ることができないためです。また、シリアル化しても問題が発生する可能性があります (基本型が不明であるため)。したがって、最初にこの問題を修正します。

しかし、さらに、依存関係が間違っている可能性があります@JsonManagedReference。常に最初にシリアル化する必要があります。そうでない場合、これらの注釈は使用できません。シリアル化しようとしているオブジェクトが表示されないと、確実に知ることは困難です (POJO 定義と JSON は少しずれているようです)。

于 2012-04-11T17:16:55.510 に答える