Marcar clases diferentes con Spring MVC y JIBX
-
26-10-2019 - |
Pregunta
Estamos tratando de construir algunos servicios RESTful con Spring MVC. Proporcionaremos varias representaciones: XML, HTML y JSON. Nos gustaría usar JIBX como tecnología OXM.
Actualmente estamos teniendo dificultades para descubrir cómo conectar el resorte con JIBX. Si queremos conectar una sola clase, por ejemplo Customer
, simplemente definimos un JibxMarshaller
, un XML MarshallingView
, y agrégalo también nuestro ContentNegotiatingViewResolver
. Esto funciona muy bien.
El problema es que no estamos seguros de cómo conectar el ensarching de múltiples clases, por ejemplo, Customer
y User
. Cada JibxMarshaller
puede admitir solo una clase (a diferencia del Jaxb2Marshaller que puede admitir muchos). Intentamos declarar a un Marshaller para cada clase, pero el MarshallingView
Solo apoya a un Marshaller. Declarando múltiples MarshallingView
S no funciona (parece que solo el primero funciona).
Su consejo es apreciado. Gracias.
<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>
Actualización basada en la respuesta de Ritesh a continuación:
Resulta que me arrojó el targetClass
propiedad del JibxMarshaller
. Pensé que significaba que el Marshaller solo funcionaría para una sola clase, sin embargo, parece que solo usa la clase de destino como una forma de encontrar todas las fijaciones relacionadas. Por lo tanto, la solución es usar solo un Marshaller, utilizando una clase de destino arbitraria de su conjunto de clases para las que tiene enlaces. Por ejemplo:
<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>
Solución
El compilador de unión JIBX agrega JiBX_bindingList
Archivos de campo a clase. En tiempo de ejecución, la 'Class de Target' (cualquier clase compilada con JiBX_bindingList
campo) se usa para construir una factura de enlace. Es el getMappedClasses()
de Ibindingfactory que es utilizado por JibxMarshaller
en Supports () Método para verificar si Marshaller puede reunir una clase.
Por favor, vea también Uso de tiempo de ejecución de JIBX.