我通过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
}
我最近遇到了类似的问题: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基于这个:
但是使用ObjectMapper杰克逊2.0而不是Jackson 1的其他Jackson课程.*
作为第一个解决方案,我保留了这些注释并创建了另一个类:ContactWithouPhoneNumber 并将其作为字段添加到 PhoneNumber 类中。
现在,在渲染之前,我将除 PhoneNumber 之外的所有字段从 contact 复制到 contactWithoutPhoneNumber。输出 JSON 包含我需要的所有内容。
这就是DTO设计模式。