2012-10-05 67 views
0

我有一個REST服務,與彈簧MVC內置:序列化父子對象

<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

是否需要對父對象或實際父對象進行引用? – jtahlborn

+0

我寧願實際的對象。問題是,如何代表孩子... – dortique

回答

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上下文使用MappingJackson2JsonViewMappingJackson2HttpMessageConverter

首先參考父母或子女包含有關對象的所有信息,而任何後續參考,只會打印id(@childId或@parentId)