Mapping 推土机-如何使推土机将值从源复制到目标,即使它已在目标中设置?

Mapping 推土机-如何使推土机将值从源复制到目标,即使它已在目标中设置?,mapping,dozer,Mapping,Dozer,我正在使用Dozer 5.3.2从源Person对象映射到目标Person对象。Person超类的默认构造函数在对象上设置UUID。因此,当我将源映射到一个新人时,新人上的UUID已经设置好,因此不会从源对象复制。在代码中,进一步向下显示完整代码: DozerBeanMapper MAPPER = // ... see code further down; Person source = new Person(); Person target = new Person(); MAPPER.map

我正在使用Dozer 5.3.2从源Person对象映射到目标Person对象。Person超类的默认构造函数在对象上设置UUID。因此,当我将源映射到一个新人时,新人上的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…,但这不是我想要的,因为这是一个更复杂问题的简化。是否有某种方法可以配置推土机或创建自定义类,以便映射器在目标对象中设置值,即使目标对象中的值不为null

我的代码如下:

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);
UUIBeanFactory的代码-我之所以使用它,是因为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;
    }
}