2011-07-14 29 views
2

トップレベル型を別のものに変換するためのカスタムコンバータをDozerで定義する方法はありますか?それはSpring Beanであり、その依存関係を注入できますか?Spring依存性注入を使用したカスタムコンバーター

ドーザドキュメントは以下のXML定義を追加することを提案する:

<converter type="org.dozer.converters.TestCustomConverter" > 
    <class-a>org.dozer.vo.CustomDoubleObject</class-a> 
    <class-b>java.lang.Double</class-b> 
    </converter> 

残念ながら、これは依存性注入をスキップれる、直接org.dozer.converters.TestCustomConverterをインスタンス化するドーザーの原因となります。代わりにSpring Beanを参照する方法はありますか?

答えて

3

カスタムコンバーターがスプリングビーンの場合、Dozer beanマッパーのプロパティ 'customConvertersWithIds'を使用してコンバータースプリングビーンを参照できます。次に、このidを使用して、マッピング内のカスタムコンバータを参照します。ここで私はそれが私のために働く作った方法です。

<bean id="dozerMapper" class="org.dozer.DozerBeanMapper" scope="singleton"> 
     <property name="mappingFiles"> 
      <list> 
       <value><mapping-file-name1></value> 
       <value><mapping-file-name2></value> 
      </list> 
     </property> 
     <property name="customConvertersWithId"> 
      <map> 
       <entry key="crbConverter" value-ref="loadableFooBeanConverter"/> 
       <entry key="sbConverter" value-ref="loadableXyzBeanConverter"/> 
      </map> 
     </property> 
    </bean> 

私は注釈付きのコンバータクラスを持って、例えば、@Component( "loadableFooBeanConverter")

マッピングの例:

<mapping> 
     <class-a>${Abc}</class-a> 
     <class-b>${AbcBean}</class-b> 
      <field custom-converter-id="sbConverter"> 
      <a>XyzId</a> 
      <b>Xyz</b> 
      <b-hint>${XyzBean}</b-hint> 
     </field> 
</mapping> 
+2

このソリューションの問題は、お客様のコンバーターを使用するたびにマッピングを宣言する必要があることです。クラスAからクラスBへ/からクラスBへのマッピング時に、このSpring管理コンバータを常に使用してください。 –

+0

この回答は無関係です。 –

0

残念ながら、これはサポートされていません。

7

前回の回答と同じようにCustomConverterWithIdsの横に、カスタムコンバータを挿入して、マッピングファイルの構成部分で定義されているコンバータをオーバーライドすることもできます。そうすれば、デフォルトのコンストラクタを使用してインスタンス化するのではなく、注入されたコンバータを使用します。

<bean id="dozerMapper" class="org.dozer.DozerBeanMapper" scope="singleton"> 
    <property name="mappingFiles"> 
     <list> 
      <value><mapping-file-name1></value> 
      <value><mapping-file-name2></value> 
     </list> 
    </property> 
    <property name="customConverters"> 
     <list> 
      <ref bean="entityConverter"/> 
     </list> 
    </property> 
</bean> 

<configuration> 
    <custom-converters> 
    <converter type="my.domain.EntityConverter"> 
     <class-a>java.lang.Integer</class-a> 
     <class-b>my.domain.MyEntity</class-b> 
    </converter> 
    <custom-converters> 
</configuration> 

<beans .... > 
    <bean id="entityConverter" class="my.domain.EntityConverter"> 
     <property .... 
    </bean 
</beans> 
0

Spring Beanをカスタムコンバータとして挿入するには、元のDozerにパッチを当てました。あなたは私の変更を見直して、あなたが受け入れられるものであれば使用することができます。更新されたソースはhttps://bitbucket.org/JRS/open-dozerにあります。

カスタムコンバーターレコードをグローバル構成に追加する必要があります。

0

@Chrisの回答を改善するために、クラスを直接参照してBeanの宣言を避けることができます。

dozerビーン宣言でカスタムコンバータビーンを宣言してください。

<bean id="DozerMapper" class="org.dozer.DozerBeanMapper"> 
    <property name="mappingFiles"> 
     <list> 
      <value>mapping.xml</value> 
     </list> 
    </property> 
    <property name="customConverters"> 
     <list> 
      <bean class="com.pharmagest.monalisa.rest.service.mapper.MyConverter"/> 
     </list> 
    </property> 
</bean> 

コンフィグレーションでマッピングを宣言したら(私の場合、mapping.xmlファイルで)、宣言します。

<configuration> 
     <stop-on-errors>true</stop-on-errors> 
     <date-format>MM/dd/yyyy HH:mm</date-format> 
     <wildcard>true</wildcard> 
     <custom-converters> 
      <converter type="com.pharmagest.monalisa.rest.service.mapper.MyConverter"> 
       <class-a>com.project.ClassA</class-a> 
       <class-b>com.project.ClassB</class-b> 
      </converter> 
     </custom-converters> 
</configuration> 
関連する問題