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>

从我到目前为止的测试来看,这似乎不起作用。我特别想知道我应该如何告诉推土机它应该按需生成 ClassB和ClassC 的实例?特别是我是否需要为 ClassB 提供特定的推土机映射,它仅作为“中间”类存在于我的目标模型中?

PS:如果有帮助,我的目标模型由 JAXB 类组成

PPS:我还尝试修改 cInstance 的 setter 方法,如果它为 null,它应该生成一个新的 ClassC 实例 - 不幸的是,没有任何运气。此外,我不想以这种方式修改 setter 方法(但是,也许我可以将其外包给将用于映射的 Factory 类)

4

2 回答 2

0

我没有推土机的经验,但从手册来看,以下应该可以工作:创建一个自定义 bean 工厂ClassB实现推土机BeanFactory接口

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 回答
0

所以看起来最终的解决方案相当简单,因为我的目标类是 JAXB 类,我可以简单地使用 JAXB 类的默认工厂 (org.dozer.factory.JAXBBeanFactory)。引爆点可能是应该直接访问深度映射目标字段('is-accessible="true"')。但是,我还创建了从 ClassA.aitems 到 ClassC.cItems 的进一步直接映射(但我不能 100% 确定这是否将用于所描述的 ClassA 到 ClassB 映射)。无论如何,最后我找到了一个相当简单和直观的解决方案,更少/没有额外的工厂编码。

于 2013-03-20T16:10:35.693 回答