2014-01-30 3 views
0

Я хочу сделать преобразование нестандартного типа с Dozer между полями с тем же именем, но разными типами в исходных и целевых объектах. я подготовил фрагмент кода, который объясняет свое намерение:Dozer 5.4 setCustomConverter не работает между полями с одним и тем же именем, но разными типами

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 

Каждый имеет представление о том, что я делаю неправильно?

ответ

1

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 [главная] DEBUG org.dozer.MappingProcessor - ПРИВЯЗАН: DozerTest $ OldPackage.version -> DozerTest $ NewPackage.version ЗНАЧЕНИЯ : 1.1 -> [email protected]b5 MAPID: 1.1