Frage

Wir versuchen, mit Spring MVC einige erholsame Dienste aufzubauen. Wir werden mehrere Darstellungen vorlegen: XML, HTML & JSON. Wir möchten Jibx als OXM -Technologie verwenden.

Wir haben derzeit Schwierigkeiten, herauszufinden, wie man die Feder mit Jibx verkabelt. Wenn wir zum Beispiel eine einzelne Klasse verkabeln wollen Customer, Wir definieren einfach a JibxMarshaller, ein XML MarshallingView, und füge es auch unsere hinzu ContentNegotiatingViewResolver. Das funktioniert großartig.

Das Problem besteht Customer und User. Jeder JibxMarshaller kann nur eine Klasse unterstützen (im Gegensatz zum JAXB2Marshaller, der viele unterstützen kann). Wir haben versucht, für jede Klasse einen Marshaller zu deklarieren, aber die MarshallingView Unterstützen Sie nur einen Marshaller. Mehrfach deklarieren MarshallingViewS funktioniert nicht (es scheint nur das erste zu funktionieren).

Ihr Rat wird geschätzt. Vielen Dank.

<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>

Update basierend auf Riteshs Antwort unten:

Es stellt sich heraus, dass ich von der abgeworfen wurde targetClass Eigentum des JibxMarshaller. Ich dachte, es bedeutete, dass der Marshaller nur für eine einzelne Klasse funktionieren würde. Es scheint jedoch nur die Zielklasse zu verwenden, um alle verwandten Bindungen zu finden. Die Lösung besteht also darin, nur einen einzelnen Marshaller mit einer willkürlichen Zielklasse aus Ihren Klassen zu verwenden, für die Sie Bindungen haben. Zum Beispiel:

<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>
War es hilfreich?

Lösung

Jibx Binding Compiler fügt hinzu JiBX_bindingList Feld zu Klassendateien. Zur Laufzeit die 'Zielklasse' (jede zusammengestellte Klasse mit JiBX_bindingList Feld) wird verwendet, um eine BindingFaktorik zu erstellen. Es ist der getMappedClasses() von IbindingFactory das wird von verwendet von JibxMarshallerin Unterstützung () Methode, um zu überprüfen, ob Marshaller eine Klasse marschallieren kann.

Bitte sehen Sie auch Jibx Laufzeitnutzung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top