2

私はブルドーザーのフレームワークを正しく評価しています。次のユースケースを処理できるかどうか疑問に思っていました。

クラス:

public ClassA {

   private Set<ItemA> aItems;
}

public ClassB {

   private ClassC cInstance;
}

public ClassC {

   private List<ItemB> bItems;
}

ブルドーザーのマッピング:

<mapping>
   <class-a>ClassA</class-a>
   <class-b>ClassB</class-b>
   <field>
      <a>aItems</a>
      <b>cInstance.bItems</b>
   </field>
 </mapping>

これまでの私のテストから、これはうまくいかないようです。私は特に、ClassBClassC のインスタンスをオンデマンドで生成する必要があることを dozer にどのように伝えればよいのでしょうか? 特に、宛先モデルの「中間」クラスとしてのみ存在する ClassB の特定の dozer マッピングが必要ですか?

PS: それが役に立てば、宛先モデルは JAXB クラスで構成されています

PPS: また、cInstance のセッター メソッドを変更して、null の場合は ClassC の新しいインスタンスを生成するようにしようとしましたが、残念ながら運がありませんでした。さらに、setter メソッドをそのように変更したくありません (ただし、マッピングに使用される Factory クラスにこれをアウトソーシングすることもできます)。

4

2 に答える 2

0

私の宛先クラスは JAXB クラスであるため、最終的な解決策はかなり単純なように見えます。JAXB クラスのデフォルト ファクトリ (org.dozer.factory.JAXBBeanFactory) を使用するだけで済みます。おそらく転換点は、ディープ マッピング先フィールドに直接アクセスする必要があることです ('is-accessible="true"')。ただし、ClassA.aitems から ClassC.cItems へのさらに直接的なマッピングも作成しました (ただし、説明した ClassA から ClassB へのマッピングにこれが使用されるかどうかは 100% わかりません)。とにかく、最終的に、追加の工場コーディングが少ない/ない、かなりシンプルで直感的なソリューションを見つけました。

于 2013-03-20T16:10:35.693 に答える
0

Dozer の経験はありませんが、マニュアルから判断すると、次のように動作するはずです。Dozerインターフェイスを実装するためのカスタム Bean ファクトリを作成します。ClassBBeanFactory

public class FactoryB implements BeanFactory {
  public Object createBean(Object source, Class sourceClass,
                           String targetBeanId) {
    assert(sourceClass.equals(ClassA.class));
    assert(ClassB.class.getName().equals(targetBeanId));
    ClassA a = (ClassA)source;
    ClassB b = new ClassB();
    if (a.aItems != null && !a.aItems.isEmpty())
      b.cInstance = new ClassC();
    return b;
  }
}

フィールドが本当にプライベートであり、パブリック アクセサーがない場合は、アクセス制限を回避する必要があるかもしれませんが、JAXB で生成されたクラスの場合はそうではありません。

これで、次のような深いマッピングで物事をマッピングできるはずです:

<mapping>
   <class-a>ClassA</class-a>
   <class-b bean-factory="FactoryB">ClassB</class-b>
   <field>
      <a>aItems</a>
      <b>cInstance.bItems</b>
   </field>
 </mapping>
于 2013-03-19T13:02:15.497 に答える