【发布时间】:2013-03-19 11:02:17
【问题描述】:
我正在正确评估推土机框架。我想知道是否可以处理以下用例:
类:
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 类)
【问题讨论】:
-
哇,不知道你想在这里做什么。看来您正在尝试将 Dozer 用作对象工厂,而不是用作复制工具。
-
你修改了 cInstance 的 setter 还是 getter?你写的是前者,但应该是后者。 Deep mapping 听起来像你想要的,但也像你尝试过的,所以我不知道它是如何失败的。 create method 可能有助于创建
ClassB的实例,其中cInstance字段已经初始化,如果可以接受的话。 -
非常感谢您的评论@MvG。是的,你可能是对的,我修改了 setter 而不是 getter(所以我会反过来尝试)。你也是对的,我正在尝试进行更深入的映射。我将尝试使用特定的 create 方法来解决此问题(尽管我最初并不打算修改目标模型的生成的 JAXB 类)。
-
只是一个简短的说明:我让它以某种方式工作,但是,并不是很理想,即,我现在正在使用直接访问 ('is-accessible="true"') 并做到了JAXB 类的一些修改(但这不是我的初衷)。所以我会尝试找到一个有自定义bean工厂并且可能直接访问的解决方案。