Java 推土机5.4 setCustomConverter无法在同名但类型不同的字段之间工作

Java 推土机5.4 setCustomConverter无法在同名但类型不同的字段之间工作,java,dozer,Java,Dozer,我想使用Dozer在源对象和目标对象中具有相同名称但不同类型的字段之间进行自定义类型转换。 我准备了一段代码片段来解释我的意图: package com; import org.dozer.CustomConverter; import org.dozer.DozerBeanMapper; import org.dozer.DozerConverter; import java.util.Arrays; public class DozerTest { public static

我想使用
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;
        }
    }
}

有人知道我做错了什么吗?

我想你忘了将贴图添加到贴图器:

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);
    }
}
静态类转换器MPL扩展DozerConverter{
ConverterImpl(){
super(Version.class、String.class);
}
@重写公共字符串convertTo(版本,字符串版本)
{
返回version.getFullVersion();
}
@重写公共版本转换源(字符串版本,VersionRig版本)
{
返回新版本(版本);
}
}
全班:

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;
    }
}
import org.dozer.CustomConverter;
导入org.dozer.DozerBeanMapper;
导入org.dozer.DozerConverter;
导入org.dozer.loader.api.BeanMappingBuilder;
导入org.dozer.loader.api.FieldsMappingOptions;
导入java.util.Collections;
公共类推土机试验
{
公共静态void main(字符串[]args)
{
DozerBeanMapper=新的DozerBeanMapper();
setCustomConverters(Collections.singletonList(newconverterImpl());
BeanMappingBuilder foo=新的BeanMappingBuilder(){
@凌驾
受保护的void configure(){
映射(OldPackage.class,NewPackage.class).fields(“version”,“version”,FieldsMappingOptions.customConverter(ConverterImpl.class));
}
};
mapper.addMapping(foo);
OldPackage OldPackage=新OldPackage();
oldPackage.setVersion(“1.1”);
NewPackage NewPackage=mapper.map(oldPackage,NewPackage.class);
System.out.println(newPackage.getVersion().getFullVersion());
}
静态类转换器MPL扩展DozerConverter{
ConverterImpl(){
super(Version.class、String.class);
}
@重写公共字符串convertTo(版本,字符串版本)
{
返回version.getFullVersion();
}
@重写公共版本转换源(字符串版本,VersionRig版本)
{
返回新版本(版本);
}
}
公共静态类NewPackage
{
私人版本;
公共版本getVersion()
{
返回版本;
}
公共无效设置版本(版本)
{
this.version=版本;
}
}
公共静态类OldPackage
{
私有字符串版本;
公共字符串getVersion()
{
返回版本;
}
公共void setVersion(字符串版本)
{
this.version=版本;
}
}
私有静态类版本
{
私有最终字符串完整版本;
私有版本(字符串完整版本)
{
this.fullVersion=fullVersion;
}
公共字符串getFullVersion()
{
返回完整版本;
}
}
}

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

13:56:34.994[main]调试org.dozer.MappingProcessor-映射:DozerTest$OldPackage.version-->DozerTest$NewPackage.version值:1.1-->be.smals.safe.centralplatform.core.utils.DozerTest$Version@1490eb5MAPID: 1.1

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