2015-10-13 3 views
0

Я внедрил пользовательские преобразователи со статическим настраиваемым параметром конвертера, используя отображение уровня поля Дозер. Но в моем случае пользовательский параметр конвертера изменится в любое время, и мне нужно будет передавать их динамически.Как обеспечить пользовательский параметр преобразователя во время выполнения в компоненте дозатора?

XML поле Уровень бульдозер Mapping:

<field custom-converter-id="decoder" custom-converter-param='{"no":15,"name":"time","size":4,"covert":"test"}'> 
     <a>data.message</a> 
     <b>test[0].testField</b> 
    </field> 

ответ

0

Если вы используете рамки инъекции зависимостей вы можете добавить параметры в какой-то боб и получить этот компонент по программным поиску из пользовательского преобразователя

или

вам может создать обертку для класса источника и передать параметр этой оболочке (предположим, что класс источника имеет тип Source, а цель Destination):

public class DataWrapper { 
    String param; 
    Source wrapped; 
    public DataWrapper(Source wrapped, String param) { 
     this.wrapped = wrapped; 
     this.param = param; 
    } 
    public String getParam() { 
     return param; 
    } 
    public Source getWrapped() { 
     return wrapped; 
    } 
} 

Затем вы должны написать конфигурацию отображения и пользовательский преобразователь для отображения DataWrapper класса к вашему Destination классу:

<custom-converters> 
     <converter type="your converter"> 
      <class-a>DataWrapper</class-a> 
      <class-b>Destination</class-b> 
     </converter> 
    </custom-converters> 

Этот конвертер будет обрабатывать param и вызвать отображение из Source класса Destination класса (отображение конфигурация следует также существует):

public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, 
     Class<?> sourceClass) { 
     DataWrapper wrapper = (DataWrapper) sourceFieldValue; 
     String param = wrapper.getParam(); 
     ... 
     return mapper.map(wrapper.getWrapped(), destinationClass); 
    } 

отображение может быть использовано следующим образом:

DataWrapper wrapper = new DataWrapper(source, "no:15, name:time, size:4, covert:test"); 
    mapper.map(wrapper, Test.class);