スプリングMVCとJIBXでさまざまなクラスをマーシャリングします
-
26-10-2019 - |
質問
Spring MVCでいくつかのRestfulサービスを構築しようとしています。 XML、HTML、およびJSONのいくつかの表現を提供します。 JIBXをOXMテクノロジーとして使用したいと考えています。
現在、JIBXでスプリングを配線する方法を理解するのが困難です。たとえば、単一のクラスを配線したい場合 Customer
, 、aを定義するだけです JibxMarshaller
, 、XML MarshallingView
, 、そしてそれも私たちに追加します ContentNegotiatingViewResolver
. 。これはうまく機能します。
問題は、たとえば、複数のクラスのマーシャリングをどのように配線するかがわからないことです。 Customer
と User
. 。各 JibxMarshaller
1つのクラスのみをサポートできます(多くのサポートできるJaxB2Marshallerとは異なります)。各クラスのマーシャラーを宣言しようとしましたが、 MarshallingView
1つのマーシャラーのみをサポートします。複数の宣言 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>
以下のRiteshの回答に基づく更新:
私はによって投げ出されたことがわかりました 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
フィールド)は、バインディングファクトリーを構築するために使用されます。それはです getMappedClasses()
の ibindingFactory 使用されます JibxMarshaller
の サポート() Marshallerがクラスをマーシャルできるかどうかを確認する方法。
ご覧ください JIBXランタイムの使用.