RESTEasy + Spring + Jackson + Jaxb

时间:2011-02-17 01:06:59

标签: jaxb jackson resteasy

我正在尝试使用RESTEasy与Jackson序列化JAXB注释类。默认情况下,ResteasyJacksonProvider配置为仅使用JACKSON注释。有没有办法配置ResteasyJacksonProvider使用spring使用JAXB注释?有几种编程方式,但如果有一些弹簧配置,则会更喜欢。

我在想的几种方式

  1. 使用ContextResolver for ObjectMapper类型返回配置为使用JaxbAnnotationIntrospector而不是JacksonAnnotationIntrospector的ObjectMapper。

  2. 扩展ResteasyJacksonProvider并在构建期间传递JAXB注释。

  3. 还有其他方式吗?

2 个答案:

答案 0 :(得分:1)

使用ContextResolver的第一个选项是有效的,但我仍然认为应该有一种更简单的方法来通过某种配置来实现。

答案 1 :(得分:0)

您只能从配置中获取此信息,无需编写任何特殊编程。 这是如何: 首先设置你的配置,我使用Jackson + JAXB,都设置在ContentNegotiatingViewResolver bean下:

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

请注意,在marshaller下我设置了oxm:class-to-be-bound - 这些是由JAXB绑定的类。

现在对于模块,我使用普通的注释包(javax.xml.bind.annotation),非特定的marshaller。 Jackson Json和JAXB都知道如何阅读它。

例如:

@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;
@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;
}

现在,在调用以.json结尾的URL时,您将获得JSON表示,并使用.xml - 和XML。如果在注释模块时给出正确的映射,则两者都由查看器翻译。