我正在尝试使用Dozer在Java中映射两个bean,并且具有以下场景:
CustomerA具有firstName和lastName
public Class CustomerA {
public String firstName;
public String lastName;
...
// Getters and Setters
}
CustomerB有名称,需要映射到firstName+" "+lastName
public Class CustomerB {
public String name;
...
// Getters and Setters
}
是否可以使用Dozer实现这一目标?映射文件将如何显示?我有一个自定义转换器如下:
public class NameConvertor {
public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
Object retValue = null;
if (source == null) {
return null;
}
if (source instanceof CustomerA) {
CustomerA src = (CustomerA) source;
CustomerB dest = (CustomerB) destination;
if (destination == null) {
dest = new CustomerB();
}
dest.setName(src.getFirstName()+" "+src.getLastName());
retValue = dest;
} else if (source instanceof CustomerB) {
CustomerB src = (CustomerB) source;
CustomerA dest = (CustomerA) destination;
if (destination == null) {
dest = new CustomerA();
}
dest.setFirstName(src.getName().split(" ")[0]);
dest.setLastName(src.getName().split(" ")[1]);
retValue = dest;
}
return retValue;
}
}
答案 0 :(得分:1)
你可以通过这个' (您的A实例)进入自定义转换器,将两个字段连接在一起并返回它们以映射到目标。
所以,在你的映射中,你会有这样的东西:
<mapping>
<class-a>path.to.CustomerA</class-a>
<class-b>path.to.CustomerB</class-b>
<field custom-converter="NameConverter" type="one-way">
<a>this</a>
<b>name</b>
</field>
</mapping>
然后在你的转换器中你会有这样的东西:
CustomerA customerA = (CustomerA) source;
StringBuilder builder = new StringBuilder();
builder.append(customerA.getFirstName());
builder.append(customerA.getLastName());
return builder.toString();
我测试了一些示例代码并按预期映射。让我知道它是否适合你!
答案 1 :(得分:0)
如何将多个字段映射到单个字段?
Dozer目前不支持此功能。由于实施它的复杂性,此功能目前尚未在路线图上。一种可能的解决方案是将多个字段包装在自定义复杂类型中,然后定义自定义转换器以在复杂类型和单个字段之间进行映射。这样,您就可以处理将三个字段映射到自定义转换器中的单个字段所需的自定义逻辑。
<强>来源:强> http://dozer.sourceforge.net/documentation/faq.html#mult-fields-to-single-field