2012-02-02 6 views
0

jaxbアノテーションのサポートをjacksonに追加する最も簡単な方法を探しています。 ジャクソンは今や春に<mvc:annotation-driven/>で追加されました。私は@ResponseBodyアノテーションでそれを必要とするオブジェクトは、メディアタイプに依存してxmlまたはjsonに変換されます。 私はspring-mvcで新しく、物事の仕組みはまだ分かりません。ありがとう。jackson jaxb annotationsがSpringでサポート

答えて

2

さて、XMLとJSONの両方を返すことができると思われます。これを行うには、両方の形式に対してMessageConverterを作成する必要があります。

XMLメッセージコンバータ:

<bean id="xmlConverter" 
    class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
    <constructor-arg> 
     <oxm:jaxb2-marshaller id="jaxb2Marshaller"> 
      <!-- you must either bind your JAXB annotated classes here --> 
      <!-- OR provide a jaxb.index and use contextPath --> 
      <oxm:class-to-be-bound name="com.mycompany.MyClass"/> 
     </oxm:jaxb2-marshaller> 
    </constructor-arg> 
    <property name="supportedMediaTypes"> 
     <list> 
      <bean class="org.springframework.http.MediaType"> 
       <constructor-arg index="0" value="application"/> 
       <constructor-arg index="1" value="xml"/> 
       <constructor-arg index="2" value="UTF-8"/> 
      </bean> 
     </list> 
    </property> 
</bean> 

JAXB注釈を使用してJSONのメッセージコンバータ、:

<bean id="jaxbAnnotationInspector" 
    class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector"/> 
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"> 
    <property name="annotationIntrospector" ref="jaxbAnnotationInspector"/> 
</bean> 
<bean id="jsonConverter" 
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <property name="objectMapper"> 
     <bean ref="jacksonObjectMapper"/> 
    </property> 
    <property name="supportedMediaTypes"> 
     <list> 
      <bean class="org.springframework.http.MediaType"> 
       <constructor-arg index="0" value="application"/> 
       <constructor-arg index="1" value="json"/> 
       <constructor-arg index="2" value="UTF-8"/> 
      </bean> 
     </list> 
    </property> 
</bean> 

し、適切なコンテンツタイプへの応答を変換します最終的には、AnnotationMethodHandlerAdapter、受諾ヘッダに応じて:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="xmlConverter"/> 
      <ref bean="jsonConverter"/> 
     </list> 
    </property> 
</bean> 

jacksonのJAXBサポートは100%完全ではなく、常に正しいとはいえませんが、開発者はバグを修正してエラーレポートに応答することができます。

+0

ありがとうございます。それは動作します(しかし、冗長です:)。今、私はすべてのJAXBアノテーション付きクラスのリストを手動で(XMLコンバータのために)提供したくありません。私に何ができる?どのようにに実装されていますか? – adsurbum

+0

上記のスニペットで指摘したように、すべてのクラスをリストするか、 'jaxb.in​​dex'を提供することができます。 [javadocs](http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html#newInstance%28java.lang.String%29)は、代わりに'ObjectFactory'クラスです。さらに古くて冗長なように思えるので、すべてのクラスを明示的にspringコンテキストXMLにリストするだけです。 – beerbajay

+0

ああ、XMLの冗長さが気に入らない場合は、独自のJavaクラスを作成してすべてのコンポーネントを配置し、そのクラスを注入することができます。私はXMLの変種が好きです。 – beerbajay

関連する問題