我正在评估推土机框架。我想知道是否可以处理以下用例:
班级:
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类)
答案 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映射)。 无论如何,最后我找到了一个相当简单和直观的解决方案,其中少了/没有额外的工厂编码。