杰克逊与双向一对多关系混淆

red*_*hka 10 json jackson

我通过MappingJacksonHttpMessageConverter使用带有Hibernate/Spring MVC的jackson 1.9.2.

杰克逊无法将双向一对多关系序列化并形成无限循环.

我正在使用的课程是:

  • 具有一组SMS实例的会话.

  • 每个SMS实例都有一组PhoneNumbers

  • 每个PhoneNumber都有一个父联系人(这是双向的多对一关系)

我想要做的是序列化对话.

如果我不使用@JsonManagedReference@JsonBackReference,那么jackson将因无限循环而崩溃.但是当我使用它们时,联系人不会被序列化到PhoneNumber中.

Class Contact {
  @JsonManagedReference
  List<PhoneNumber> phoneNumber ;
}
Class PhoneNumber {
  @JsonBackReference 
  Contact contact;
}

输出是:

{    <--------------------- Conversation
    "id": 51,
    "smsSet": [
      {
        "id": 53,
        "origin": 0123465,
        "destination": "06533844XY",
        "message": "Hello world!",
        "phoneNumbers": [
          {
            "id": 64,
            "num": "06533844XY",
            "creationDate": 1333992533000,
          }
        ],
      }
    ],
    "creationDate": 1333992534000
  }

代替

{    <---------- conversation
    "id": 51,
    "smsSet": [
      {
        "id": 53,
        "origin": 0123465,
        "destination": "06533844XY",
        "message": "Hello world!",
        "phoneNumbers": [
          {
            "id": 64,
            "num": "06533844XY",
            "creationDate": 1333992533000,
            "contact":  <--------------------- Missing part
             {
                "id": 12,
                "name": "Samuel Jackson",
                "primaryNumber": "06533844XY"
             }
          }
        ],
      }
    ],
    "creationDate": 1333992534000
  }

Eug*_*sky 7

我最近遇到了类似的问题:Jackson - 具有双向关系的实体的序列化(避免循环)

因此解决方案是升级到Jackson 2.0,并向类中添加以下注释:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
                  property = "@id")
public class SomeEntityClass ...
Run Code Online (Sandbox Code Playgroud)

那么问题是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>
Run Code Online (Sandbox Code Playgroud)

而且.MappingJacksonHttpMessageConverter的own.implementation.of基于这个:

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杰克逊2.0而不是Jackson 1的其他Jackson课程.*


red*_*hka 2

作为第一个解决方案,我保留了这些注释并创建了另一个类:ContactWithouPhoneNumber 并将其作为字段添加到 PhoneNumber 类中。

现在,在渲染之前,我将除 PhoneNumber 之外的所有字段从 contact 复制到 contactWithoutPhoneNumber。输出 JSON 包含我需要的所有内容。

这就是DTO设计模式。