我正在使用 Dozer (5.3.2) 从源 Person 对象映射到目标 Person 对象。Person 超类的默认构造函数在对象上设置了一个 UUID。因此,当我将源映射到新 Person 时,新 Person 上的 UUID 已经设置,因此不会从源对象复制。在代码中(完整代码进一步向下):
DozerBeanMapper MAPPER = // ... see code further down;
Person source = new Person();
Person target = new Person();
MAPPER.map(source, target);
我想要什么:在调用 MAPPER.map(...) 之后,我希望 target.getUuid() 等于 source.getUuid()。到目前为止,它们是不同的(因为它们在超级构造函数中设置为 UUID.randomUUID,见下文)。
我可以通过设置解决这个问题
target.setUuid(null);
在调用 MAPPER.MAP(...) 之前,但这不是我想要的,因为这是对更复杂问题的简化。是否有某种方法可以配置 Dozer 或制作自定义类,以便映射器在目标对象中设置值,即使目标对象中的值不为空?
我的代码如下:
public abstract class AbstractEntity
{
private long uuid;
public AbstractEntity() {
this(UUID.randomUUID());
}
public AbstractEntity(long uuid) {
this.uuid = uuid;
}
public UUID getUuid()
{
return this.uuid;
}
public void setUuid(final UUID uuid)
{
this.uuid = uuid;
}
}
public class Person extends AbstractEntity
{
// Getters and setters...
}
下面是创建和执行推土机映射器的代码:
DozerBeanMapper MAPPER = new DozerBeanMapper();
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
mapping(UUID.class, UUID.class, TypeMappingOptions.oneWay(), TypeMappingOptions.mapNull(true),
TypeMappingOptions.beanFactory(UuidBeanFactory.class.getName()));
}
};
MAPPER.addMapping(builder);
Person source = new Person();
Person target = new Person();
MAPPER.map(source, target);
UUIDBeanFactory 的代码 - 我使用它是因为 UUID 没有空的构造函数,这会使 Dozer 抛出异常。
public class UuidBeanFactory implements BeanFactory
{
@Override
public Object createBean(Object sourceObject, Class<?> aClass, String s)
{
if (sourceObject == null)
{
return null;
}
UUID source = (UUID) sourceObject;
UUID target = new UUID(source.getMostSignificantBits(), source.getLeastSignificantBits());
return target;
}
}