2013-06-14 5 views
0

Я прочитал в документации пользовательского конвертера, что для пользовательского конвертера при сопоставлении полей я могу передать пользовательский параметр. Это не очень хорошо для меня, потому что это указано один раз при построении картографа.Передача настраиваемого параметра на отображение Dozer

Есть ли способ передать этот параметр при выполнении фактического сопоставления?

mapper.map(sourceObject, Destination.class, "parameter"); 

Моя актуальная проблема в том, что я хочу, чтобы отобразить из одного класса, содержащего свойства мульти лингвальных и назначения должны иметь только «Выбирается» свойства языка.

Источник класс

public class Source 
{ 
    // Fields in default language 
    private String prop1; 
    private String prop2; 

    // List containing all translations of properties 
    private List<SourceName> sourceNames; 

} 

public class SourceName 
{ 
    private int lang_id; 
    private String prop1; 
    private String prop2; 
} 

класс назначения

public class Destination 
{ 
     // Fields translated in choosen language 
     private String prop1; 
     private String prop2; 
} 

Моя цель состоит в том, чтобы быть в состоянии сделать так:

Destination destination = mapper.map(source, Destination.class, 4); // To lang_id 4 

Благодаря

ответ

1

Я сделал эту функцию (FIELDMAP УАК "fieldMap"):

public static <T> T mapWithParam(Object source, Class<T> destinationClass, String param) throws MappingException { 

    T toReturn = null; 
    DozerBeanMapper dbm = (DozerBeanMapper) MapperFactory.getMapper(); 
    MappingMetadata mmdt = dbm.getMappingMetadata(); 
    ClassMappingMetadata classMapping = mmdt.getClassMapping(source.getClass(), destinationClass); 
    List<FieldMappingMetadata> fielMappingMetadata = classMapping.getFieldMappings(); 
    List<OriginalFieldMap> originalValues = new ArrayList<OriginalFieldMap>(); 
    for (FieldMappingMetadata fmmd : fielMappingMetadata) { 
     if (fmmd.getCustomConverter() != null) { 
      try { 
       Class<?> cls = Class.forName(fmmd.getCustomConverter()); 
       if (cls.newInstance() instanceof ConfigurableCustomConverter) { 
        FieldMap modifieldFieldMap = (FieldMap)ReflectionHelper.executeGetMethod(fmmd, FIELDMAP); 
        originalValues.add(new OriginalFieldMap(modifieldFieldMap, modifieldFieldMap.getCustomConverterParam())); 
        modifieldFieldMap.setCustomConverterParam(param); 
        ReflectionHelper.executeSetMethod(fmmd, FIELDMAP, modifieldFieldMap); 
       } 
      } catch (ReflectionException | ClassNotFoundException | InstantiationException | IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    toReturn = dbm.map(source, destinationClass); 

    for (OriginalFieldMap ofp : originalValues) { 
     ofp.getFieldMap().setCustomConverterParam(ofp.getOriginalValue()); 
    } 
    return toReturn; 
} 

И OriginalFieldMap класс:

import org.dozer.fieldmap.FieldMap; 

public class OriginalFieldMap{ 
    FieldMap fieldMap; 
    String originalValue; 

    public OriginalFieldMap(FieldMap fieldMap, String originalValue) { 
     super(); 
     this.fieldMap = fieldMap; 
     this.originalValue = originalValue; 
    } 
    public FieldMap getFieldMap() { 
     return fieldMap; 
    } 
    public String getOriginalValue() { 
     return originalValue; 
    } 
}