2

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

我正在考虑的几种方法

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

  2. 扩展 ResteasyJacksonProvider 并在构建时传递 JAXB 注解。

还有什么办法吗?

4

2 回答 2

1

那么使用 ContextResolver 的第一个选项是可行的,但我仍然认为应该有一种更简单的方法来通过一些配置来做到这一点。

于 2011-02-18T19:07:01.173 回答
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>

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

现在对于模块,我使用了非编组器特定的普通注释包(javax.xml.bind.annotation)。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。两者都由查看器翻译,前提是您在注释模块时提供了正确的映射。

于 2011-03-10T03:44:23.047 回答