2011-01-28 4 views
3

Spring MVCでいくつかのRESTfulサービスを構築しようとしています。 XML、HTML、& JSONという表現をいくつか提供します。 OXM技術としてJiBXを使用したいと考えています。Spring MVCとJIBXで異なるクラスをマーシャリングする

現在、SpringをJiBXに接続する方法を理解することができません。たとえば、Customerのように1つのクラスを結び付けたい場合は、JibxMarshallerとXML MarshallingViewを定義し、それにContentNegotiatingViewResolverを追加するだけです。これは素晴らしいです。

問題は複数のクラスのマーシャリングを結ぶ方法がわからないことです。たとえば、CustomerUserです。各JibxMarshallerは、1つのクラスのみをサポートできます(多くをサポートできるJaxb2Marshallerとは異なります)。各クラスのマーシャラーを宣言しようとしましたが、MarshallingViewは1つのマーシャラーしかサポートしていません。複数のMarshallingViewが宣言されていません(最初のものだけが表示されます)。

あなたのアドバイスは高く評価されます。ありがとう。

<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の回答に基づいて更新:

それは私がJibxMarshallertargetClassプロパティではオフにスローされたことが判明しました。私はそれがマーシャラーが単一のクラスのためだけに働くということを意味していると思ったが、関連するすべてのバインディングを見つける方法としてターゲットクラスを使用するように見える。そのため、解決策は、バインディングを持つクラスセットから任意のターゲットクラスを使用して、ただ1つのマーシャラーを使用することです。たとえば:

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

答えて

2

JiBXのバインディングコンパイラは、クラスファイルにJiBX_bindingListフィールドを追加します。実行時に、 'targetClass'(JiBX_bindingListフィールドのコンパイル済みクラス)を使用してBindingFactoryを構築します。 supports()で使用されているgetMappedClasses()IBindingFactoryであり、マーシャラーがクラスをマーシャリングできるかどうかを確認する方法です。

JiBX runtime usageもご覧ください。

+0

私は最終的にこれを数週間後に再調査し、さらに調査したところ、あなたが正しいと思われます。自分の誤解は、マーシャルの「targetClass 」プロパティだと思います。私にとって、このプロパティは、マーシャラーがターゲットクラスに対してのみ機能することを意味しますが、これは真実ではありません。 – SingleShot

+0

元の質問に私のソリューションを追加しました。ご協力いただきありがとうございます! – SingleShot

+0

私はこの全く同じ問題を抱えていますが、任意のクラスを持つ単一のjibx marshlerには私の問題を解決していません。私がすべきことは他にありますか? – Richie

関連する問題