如何根据需要生成属性的类实例?

时间:2013-03-19 11:02:17

标签: java dozer

我正在评估推土机框架。我想知道是否可以处理以下用例:

班级:

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>

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

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

组成

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

2 个答案:

答案 0 :(得分:0)

我没有Dozer的经验,但从手册来看,以下内容应该有效:为ClassB 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; } } 创建custom bean factory

<mapping>
   <class-a>ClassA</class-a>
   <class-b bean-factory="FactoryB">ClassB</class-b>
   <field>
      <a>aItems</a>
      <b>cInstance.bItems</b>
   </field>
 </mapping>

如果你的字段真的是私有的,并且你没有它们的公共访问器,你可能不得不绕过访问限制,但对于JAXB生成的类,情况应该不是这样。

现在,您应该可以使用dozer BeanFactory interface来映射事物:

{{1}}

答案 1 :(得分:0)

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