1

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(...) を呼び出す前ですが、これはより複雑な問題を簡略化したものであるため、これは私が望むものではありません。ターゲット オブジェクトの値が null でなくてもマッパーがターゲット オブジェクトに値を設定するように、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...
}

dozer マッパーを作成して実行するコードは次のとおりです。

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

0 に答える 0