Поддержка аннотаций Jackson Jaxb в Spring - PullRequest
0 голосов
/ 02 февраля 2012

Я ищу самый простой способ добавить поддержку аннотаций jaxb к Джексону.Джексон добавлен в Spring на <mvc:annotation-driven/>.Мне нужно, чтобы по аннотации @ResponseBody Объект преобразовывался в xml или json в зависимости от типа носителя.Я новичок в весенне-MVC, поэтому пока не очень хорошо понимаю, как все работает.Спасибо.

1 Ответ

3 голосов
/ 02 февраля 2012

Хорошо, я предполагаю, что вы хотите иметь возможность возвращать как XML, так и JSON. Для этого вам нужно создать MessageConverter s для обоих форматов.

Конвертер 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>

Конвертер сообщений JSON, использующий аннотации JAXB:

<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>

Обратите внимание, что поддержка JAXB в Джексоне не на 100% завершена или исправлена ​​постоянно, но разработчики действительно хороши в исправлении ошибок и реагировании на сообщения об ошибках.

...