【问题标题】:RESTEasy + Spring + Jackson + JaxbRESTEasy + Spring + Jackson + Jaxb
【发布时间】:2011-02-17 01:06:58
【问题描述】:

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

我想到的几种方式

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

  2. 扩展 ResteasyJacksonProvider 并在构建过程中传递 JAXB 注解。

还有其他方法吗?

【问题讨论】:

    标签: jaxb jackson resteasy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以仅从配置中获取此信息,无需编写任何特殊程序。 方法如下: 首先正确设置您的配置,我使用 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),非编组器特定的。 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。两者都由查看器翻译,前提是您在注释模块时提供了正确的映射。

      【讨论】:

      • 如果使用 spring-web 或 spring-mvc 进行调度,您的解决方案将有效。我正在使用 RESTEasy。谢谢。
      • 哦,没注意,太着急回答:)
      猜你喜欢
      • 2012-02-25
      • 2019-02-17
      • 2013-09-17
      • 2015-04-03
      • 2011-09-24
      • 2013-02-09
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多