2011-01-28 4 views
3

Мы пытаемся создать некоторые службы RESTful с помощью Spring MVC. Мы будем предоставлять несколько представлений: XML, HTML, & JSON. Мы хотели бы использовать JiBX в качестве технологии OXM.Маршаллинг различных классов с Spring MVC и JIBX

В настоящее время мы с трудом выясняем, как подключить весну с помощью JiBX. Если мы хотим подключить один класс, например Customer, мы просто определим JibxMarshaller, XML MarshallingView и добавим его также в наш ContentNegotiatingViewResolver. Это отлично работает.

Проблема в том, что мы не уверены, как подключить сортировку нескольких классов, например, Customer и User. Каждый JibxMarshaller может поддерживать только один класс (в отличие от Jaxb2Marshaller, который может поддерживать многие). Мы попробовали объявить маршаллера для каждого класса, но MarshallingView поддерживают только один маршаллер. Объявление нескольких MarshallingView s не работает (появляется только первый файл).

Ваш совет приветствуется. Благодарю.

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <util:map> 
      <entry key="xml" value="application/xml"/> 
     </util:map> 
    </property> 
    <property name="defaultViews"> 
     <util:list> 
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
       <property name="marshaller" ref="userMarshaller"/> 
      </bean> 
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
       <property name="marshaller" ref="customerMarshaller"/> 
      </bean> 
     </util:list> 
    </property> 
</bean> 

<bean id="userMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller"> 
    <property name="targetClass" value="com.mycompany.User"/> 
</bean> 
<bean id="customerMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller"> 
    <property name="targetClass" value="com.mycompany.Customer"/> 
</bean> 

Обновление на основе ответа Ritesh в поле ниже:

Оказывается, что я скинул по targetClass имущества JibxMarshaller. Я думал, что это означает, что маршаллер будет работать только для одного класса, однако, похоже, он просто использует целевой класс как способ найти все связанные привязки. Таким образом, решение состоит в том, чтобы использовать только один маршаллер, используя произвольный целевой класс из вашего набора классов, для которых вы привязываетесь. Например:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <util:map> 
      <entry key="xml" value="application/xml"/> 
     </util:map> 
    </property> 
    <property name="defaultViews"> 
     <util:list> 
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
       <property name="marshaller" ref="jibxMarshaller"/> 
      </bean> 
     </util:list> 
    </property> 
</bean> 

<bean id="jibxMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller"> 
    <property name="targetClass" value="com.mycompany.User"/> 
</bean> 

ответ

2

JiBX связывание компилятор добавляет JiBX_bindingList поля к файлам классы. Во время выполнения «targetClass» (любой скомпилированный класс с полем JiBX_bindingList) используется для построения BindingFactory. Это getMappedClasses() от IBindingFactory, который используется JibxMarshaller в supports() метод, чтобы проверить, может ли маршал маршал класс.

См. Также JiBX runtime usage.

+0

Я, наконец, пересматриваю это через несколько недель и при дальнейшем расследовании кажется, что вы правы. Я думаю, что непонимание с моей стороны - свойство targetClass "на маршаллере. Для меня это свойство подразумевает, что маршаллер будет работать только для целевого класса, что неверно. – SingleShot

+0

Я приложил свое решение к исходному вопросу. Спасибо за вашу помощь! – SingleShot

+0

У меня есть такая же проблема, но предоставление одного jibx-маршлера с произвольным классом не решило мою проблему. Есть ли что-то еще, что я должен делать? – Richie