Мы пытаемся создать некоторые RESTful-сервисы с помощью Spring MVC. Мы будем предоставлять несколько представлений: XML, HTML и JSON. Мы хотели бы использовать JiBX в качестве технологии OXM.
В настоящее время нам сложно понять, как подключить Spring к 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>
Обновление на основе ответа Ритеша ниже:
Оказывается, я был сброшен свойством 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>