0

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 サービスは、それぞれ親と子を取得する 2 つの「メソッド」を公開しています。

@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 は期待どおりに機能し、すべての子を含む親を返しますが、2 番目のメソッド getChild は単一の子を返しますが、その親への参照はありません。

json for parent: {"parent_id": 1, "children": [{"child_id":1},{"child_id":2}]}    
json for child: {"child_id":1}

私の質問は、getChild がその親オブジェクトへの何らかの参照を返すように、シリアル化をどのように設定すればよいかということです。

4

1 に答える 1

1

Jackson2.0とSpring3.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;
}

使用するサーブレットコンテキストを更新しMappingJackson2JsonViewMappingJackson2HttpMessageConverter

親または子への最初の参照にはオブジェクトに関するすべての情報が含まれますが、その後の参照ではID(@childIdまたは@parentId)のみが出力されます。

于 2012-10-08T12:49:16.163 に答える