Java 将一个bean中的firstName、lastName映射到另一个bean中的name

Java 将一个bean中的firstName、lastName映射到另一个bean中的name,java,dozer,Java,Dozer,我正在尝试使用Dozer在Java中映射两个bean,并具有以下场景: CustomerA有名字和姓氏 public Class CustomerA { public String firstName; public String lastName; ... // Getters and Setters } CustomerB有名称,需要映射到firstName+“”+lastName public Class CustomerB { public St

我正在尝试使用Dozer在Java中映射两个bean,并具有以下场景:

CustomerA有名字和姓氏

public Class CustomerA {
    public String firstName;
    public String lastName;
    ...
    // Getters and Setters
}
CustomerB有名称,需要映射到
firstName+“”+lastName

public Class CustomerB {
    public String name;
    ...
    // Getters and Setters
}
是否可以使用推土机来实现这一点?映射文件的外观如何?我有一个自定义转换器,如下所示:

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;
    }
}

如何将多个字段映射到单个字段?

推土机目前不支持此功能。而且由于实现它的复杂性,这一功能目前还没有出现在路线图上。一个可能的解决方案是将多个字段包装在一个自定义复杂类型中,然后定义一个自定义转换器,用于在复杂类型和单个字段之间进行映射。通过这种方式,您可以处理将三个字段映射到自定义转换器中的单个字段所需的自定义逻辑

来源:

我还建议您查看此处

您可以将“this”(您的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();

我使用一些示例代码进行了测试,并按照预期映射了它。让我知道它是否适合你

你的映射文件是什么样子的?请参阅文档链接: