我有一个使用spring-mvc构建的REST服务:
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="contentType" value="text/plain"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list id="beanList">
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</util:list>
</property>
</bean>
为了避免序列化中的循环引用,我按如下方式注释对象:
class Parent implements Serializable {
int parent_id;
@JsonManagedReference
private List<Child> children;
}
class Child implements Serializable {
int child_id;
@JsonBackReference
private Parent parent;
}
我的REST服务公开了两个分别获取父级和子级的“方法”:
@RequestMapping(value = "/parent/{id}", method = RequestMethod.GET)
@ResponseBody public Parent getParent(@PathVariable int id , Model model) {
Parent parent = myManager.getParent(id);
return parent;
}
@RequestMapping(value = "/child/{id}", method = RequestMethod.GET)
@ResponseBody public Child getChild(@PathVariable int id , Model model) {
Child child = myManager.getChild(id);
return parent;
}
第一个方法getParent按预期工作并返回一个Parent,包含所有子节点,但第二个方法getChild返回一个子节点,不有任何引用返回它的父节点。
json for parent: {"parent_id": 1, "children": [{"child_id":1},{"child_id":2}]}
json for child: {"child_id":1}
所以我的问题是,我如何设置序列化,以便getChild返回对它的父对象的某种引用?
答案 0 :(得分:1)
我通过升级到Jackson 2.0和Spring 3.1.2(增加了对jackson 2.0的支持)解决了这个问题。
我现在注释这样的类:
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property = "@parentId")
class Parent implements Serializable {
int parent_id;
private List<Child> children;
}
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property = "@childId")
class Child implements Serializable {
int child_id;
private Parent parent;
}
并更新了servlet-context以使用MappingJackson2JsonView
和MappingJackson2HttpMessageConverter
对父或子的第一次引用包含有关该对象的所有信息,而任何后续引用只会打印id(@childId或@ parentId)