RESTEasy + Spring + Джексон + Jaxb - PullRequest
       10

RESTEasy + Spring + Джексон + Jaxb

2 голосов
/ 17 февраля 2011

Я пытаюсь сериализовать аннотированный класс JAXB с Джексоном, используя RESTEasy. По умолчанию ResteasyJacksonProvider настроен на использование только аннотации JACKSON. Есть ли способ настроить ResteasyJacksonProvider для использования аннотации JAXB с использованием Spring? Есть несколько программных способов, но предпочтительнее, если есть какая-то конфигурация пружины.

Пара способов, о которых я думаю

  1. Используйте ContextResolver для типа ObjectMapper для возврата ObjectMapper, настроенного на использование JaxbAnnotationIntrospector вместо JacksonAnnotationIntrospector.

  2. Расширьте ResteasyJacksonProvider и передайте аннотацию JAXB во время строительства.

Есть другой способ?

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Ну, первый вариант использования ContextResolver работает, но я все еще думаю, что должен быть более простой способ сделать это, просто с помощью некоторой конфигурации.

0 голосов
/ 10 марта 2011

Вы можете получить это только из конфигурации, не нужно ничего запрограммировать. Вот как это сделать: Сначала установите правильную конфигурацию, я использую Jackson + JAXB, оба установлены в компоненте ContentNegotiatingViewResolver:

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1"/>
        <property name="mediaTypes">
            <map>
                <entry key="xml" value="application/xml" />
                <entry key="json" value="application/json" />
            </map>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <property name="marshaller">
                        <oxm:jaxb2-marshaller id="marshaller">
                            <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.page.PageObject" />
                            <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.tab.TabObject" />
                            <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.section.SectionObject" />
                            <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.element.nonembedded.ElementObject"/>
                            <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.element.embedded.EmbeddedElementObject"/>
                            <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.chart.common.ChartManager"/>
                        </oxm:jaxb2-marshaller>
                    </property>
                </bean>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
            </list>
        </property>
    </bean>

Обратите внимание, что под маршаллером я установил oxm: class-to-be-bound - это классы, которые будут связаны JAXB.

Теперь для модуля я использовал обычный пакет аннотаций (javax.xml.bind.annotation), не относящийся к маршаллеру. Джексон Джсон и Джексон оба знают, как читать.

Например:

@XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name="page") public class PageObject implements ComponentTypeObject{ @XmlAttribute(name="name") private String name; @XmlAttribute(name="id",required=true) private String id;<br> @XmlElements({@XmlElement(name="tab", type=TabXmlAdapter.class)}) private List<TabXmlAdapter> tabRef;

Наконец, контроллер для вашего MVC должен вернуть модель и представление:

    @RequestMapping(value="/get_page", method = RequestMethod.GET)
public ModelAndView initPage()
{
    ModelAndView mav = null;
    try
    {
        PageObject myPage = (PageObject) Utilities.getUtilities().loadObjectFromFile(XmlComponentType.page);
        mav = new ModelAndView("page","page",myPage);
    }
    catch (Exception e)
    { 
        e.getMessage();
    }
    return mav;
}

Теперь при вызове вашего URL, заканчивающегося на .json, вы получите представление JSON, а также .xml - и XML. Обе программы переведены средством просмотра, если вы указали правильное отображение при аннотировании модуля.

...