2011-02-17 3 views
2

RESTEasy를 사용하여 JAXB 주석 클래스를 Jackson과 직렬화하려고합니다. 기본적으로 ResteasyJacksonProvider는 JACKSON 주석 만 사용하도록 구성됩니다. Spring을 사용하여 JAXB 주석을 사용하도록 ResteasyJacksonProvider를 구성하는 방법이 있습니까? 몇 가지 프로그래밍 방식이 있지만 몇 가지 스프링 구성이있는 경우 더 선호합니다. 내가 ObjectMapper 유형RESTEasy + Spring + Jackson + Jaxb

  1. 사용 ContextResolver 생각하고 방법

    커플 ObjectMapper이 JaxbAnnotationIntrospector 대신 JacksonAnnotationIntrospector을 사용하도록 구성으로 돌아갑니다.

  2. ResteasyJacksonProvider를 확장하고 건설 중에 JAXB 주석을 전달하십시오.

다른 방법으로?

답변

1

글쎄요. ContextResolver를 사용하는 첫 번째 옵션은 잘 작동하지만 아직도 일부 설정에 의해 더 쉬운 방법이 있어야한다고 생각합니다.

0

구성을 통해서만 얻을 수 있습니다. 특별한 것을 프로그램 할 필요가 없습니다. 여기 방법입니다 : 먼저 구성 권한을 설정, 내가 잭슨 + JAXB를 사용 모두에 ContentNegotiatingViewResolver 빈에서 설정 :

마샬에서 나는 OXM 설정 사항 것을
<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> 

: 클래스 - 투 - 바인딩을 - 그 JAXB에 의해 바인딩되는 클래스입니다.

이제 모듈에 대해 비 marshaller 관련 일반 주석 패키지 (javax.xml.bind.annotation)를 사용했습니다. Jackson Json과 JAXB는 모두 그것을 읽는 법을 알고 있습니다. 예를 들어

: 당신이 얻을 것 확장자가 .json URL을 호출하는 동안 지금

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

: 마지막으로 당신의 MVC의 컨트롤러는 모델과 뷰를 반환해야

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

JSON 표현 및 .xml - 및 XML. 모듈에 주석을 달 때 올바른 매핑을 제공했다면 두 가지 모두 뷰어에 의해 변환됩니다.

+0

디스패치에 spring-web 또는 spring-mvc를 사용하는 경우 솔루션이 작동합니다. RESTEasy를 사용하고 있습니다. 감사. – Kamlesh

+0

아, 통지하지 않았다, 너무 대답했다 :) – jazzcool