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 MarshallingViewS 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>
¿Fue útil?

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 JibxMarshalleren Supports () Método para verificar si Marshaller puede reunir una clase.

Por favor, vea también Uso de tiempo de ejecución de JIBX.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top