Marshalling различные классы с Spring MVC и JIBX
-
26-10-2019 - |
Вопрос
Мы пытаемся создать несколько спокойных услуг с Spring MVC. Мы будем предоставлять несколько представлений: XML, HTML и JSON. Мы хотели бы использовать JIBX в качестве технологии OXM.
В настоящее время у нас возникает трудности с выяснением, как подключить пружину с помощью JIBX. Если мы хотим подключить один класс, например, Customer
, мы просто определяем JibxMarshaller
, XML MarshallingView
, и добавьте тоже наше ContentNegotiatingViewResolver
. Анкет Это прекрасно работает.
Проблема в том, что мы не уверены, как подключить, например, Marshalling из нескольких классов, 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>
Решение
Компилятор связывания Jibx добавляет JiBX_bindingList
Поле в файлы класса. Во время выполнения, «TargetClass» (любой скомпилированный класс с JiBX_bindingList
Поле) используется для построения BindingFactory. Это getMappedClasses()
из Ibindingfactory который используется JibxMarshaller
в поддержка () Метод, чтобы проверить, может ли Маршаллер маршал класс.
Пожалуйста, также посмотрите Использование времени выполнения JIBX.