Dozer 5.4 SetCustomConverter在同名字段之间不起作用,而是在不同类型的字段之间起作用



我想在字段之间使用Dozer进行自定义类型转换,但具有相同名称,但源对象和目标对象中的不同类型。我准备了解释我意图的代码段:

package com;
import org.dozer.CustomConverter;
import org.dozer.DozerBeanMapper;
import org.dozer.DozerConverter;
import java.util.Arrays;
public class DozerTest
{
    public static void main(String[] args)
    {
        DozerBeanMapper mapper = new DozerBeanMapper();
        mapper.setCustomConverters(Arrays.<CustomConverter>asList(new DozerConverter<Version, String>(Version.class, String.class)
                {
                    @Override public String convertTo(Version version, String versionOrig)
                    {
                        return version.getFullVersion();
                    }
                    @Override public Version convertFrom(String version, Version versionOrig)
                    {
                        return new Version(version);
                    }
                }));
        OldPackage oldPackage = new OldPackage();
        oldPackage.setVersion("1.1");
        NewPackage newPackage = mapper.map(oldPackage, NewPackage.class);
        System.out.println(newPackage.getVersion().getFullVersion());
    }
    public static class NewPackage
    {
        private Version version;
        public Version getVersion()
        {
            return version;
        }
        public void setVersion(Version version)
        {
            this.version = version;
        }
    }
    public static class OldPackage
    {
        private String version;
        public String getVersion()
        {
            return version;
        }
        public void setVersion(String version)
        {
            this.version = version;
        }
    }
    private static class Version
    {
        private final String fullVersion;
        private Version(String fullVersion)
        {
            this.fullVersion = fullVersion;
        }
        public String getFullVersion()
        {
            return fullVersion;
        }
    }
}

我收到此错误消息:

Exception in thread "main" org.dozer.MappingException: Illegal object type for the method 'setVersion'. 
 Expected types: 
com.DozerTest$Version
 Actual types: 
java.lang.String

有人知道我做错了什么?

ik认为您忘了将映射添加到映射器中:

BeanMappingBuilder foo = new BeanMappingBuilder() {
        @Override
        protected void configure() {
            mapping(OldPackage.class, NewPackage.class).fields("version", "version", FieldsMappingOptions.customConverter(ConverterImpl.class));
        }
    };
mapper.addMapping(foo);

我创建了一个静态内部类来表示您的dozerconverter实现,以在您的beanmappingbuilder中引用它:

static class ConverterImpl extends DozerConverter<Version, String> {
    ConverterImpl() {
        super(Version.class, String.class);
    }
    @Override public String convertTo(Version version, String versionOrig)
    {
        return version.getFullVersion();
    }
    @Override public Version convertFrom(String version, Version versionOrig)
    {
        return new Version(version);
    }
}

完整班级:

import org.dozer.CustomConverter;
import org.dozer.DozerBeanMapper;
import org.dozer.DozerConverter;
import org.dozer.loader.api.BeanMappingBuilder;
import org.dozer.loader.api.FieldsMappingOptions;
import java.util.Collections;
public class DozerTest
{
   public static void main(String[] args)
   {
    DozerBeanMapper mapper = new DozerBeanMapper();
    mapper.setCustomConverters(Collections.<CustomConverter>singletonList(new ConverterImpl()));
    BeanMappingBuilder foo = new BeanMappingBuilder() {
        @Override
        protected void configure() {
            mapping(OldPackage.class, NewPackage.class).fields("version", "version", FieldsMappingOptions.customConverter(ConverterImpl.class));
        }
    };
    mapper.addMapping(foo);
    OldPackage oldPackage = new OldPackage();
    oldPackage.setVersion("1.1");
    NewPackage newPackage = mapper.map(oldPackage, NewPackage.class);
    System.out.println(newPackage.getVersion().getFullVersion());
}
static class ConverterImpl extends DozerConverter<Version, String> {
    ConverterImpl() {
        super(Version.class, String.class);
    }
    @Override public String convertTo(Version version, String versionOrig)
    {
        return version.getFullVersion();
    }
    @Override public Version convertFrom(String version, Version versionOrig)
    {
        return new Version(version);
    }
}
public static class NewPackage
{
    private Version version;
    public Version getVersion()
    {
        return version;
    }
    public void setVersion(Version version)
    {
        this.version = version;
    }
}
public static class OldPackage
{
    private String version;
    public String getVersion()
    {
        return version;
    }
    public void setVersion(String version)
    {
        this.version = version;
    }
}
private static class Version
{
    private final String fullVersion;
    private Version(String fullVersion)
    {
        this.fullVersion = fullVersion;
    }
    public String getFullVersion()
    {
        return fullVersion;
    }
}

}

执行此测试类时,您将获得所需的输出:

13:56:34.994 [main] debug org.dozer.mappingprocessor-映射:dozertest $ oldpackage.version-> dozertest $ newpackage.version values:1.1-> be.smals.smals.safe.centralplatform.core.utils.core.utils.utils.utils.utils.utils.utils.utils.utils.dozertest $版本@1490EB5 mapID:1.1

最新更新