Dozer, как использовать Custom Converter by Id? - PullRequest
0 голосов
/ 08 октября 2019

Я создаю загрузочное приложение Sprint, где я делаю запрос, а затем получаю ответ. Прежде чем я сделаю запрос, мне нужно преобразовать свои данные. Но класс Destination для преобразования может отличаться для того же класса Source для преобразования. Пример:

    public Request getTransformedRequest(Request, String typeTransformation) {
        Request transformedRequest= mapper.map(request,Request.class);
        return transformedRequest;
}

Если я не использую Конвертеры, и я использую только обычное отображение Dozer, я могу иметь следующее в моем mapping.xml;

<mapping map-id="Type1">
  <class-a>ClassA</class-a>
  <class-b>ClassB</class-b>   
</mapping> 
<mapping map-id="Type2">
 <class-a>ClassA</class-a>
 <class-b>ClassC</class-b>   
</mapping> 

И затем вмой код, для того же класса Source, я могу переключиться с помощью идентификатора сопоставления;

  ClassB mapper.map(request,Request.class,"Type1"); //Here ClassB extends Request
  ClassC mapper.map(request,Request.class,"Type2"); //Here ClassC extends Request

Моя проблема, это не может сделать то же самое с конвертерами. Я хочу иметь разные конвертеры для одного и того же класса источника:

  <convertertype="CustomConverterType1" >
    <class-a>
      ClassA
    </class-a>
    <class-b>
      ClassB
    </class-b>
  </converter>
 <converter type="CustomConverterType2" >
    <class-a>
      ClassA
    </class-a>
    <class-b>
      ClassC
    </class-b>
  </converter>

Итак, в моем сценарии я хотел бы выбрать (как в примере с идентификатором отображения) желаемый конвертер. Я действительно ценю ту же помощь. Заранее спасибо.

1 Ответ

0 голосов
/ 10 октября 2019

Пользовательские преобразователи, как правило, используются на уровне полей для определения соответствия для определенной пары полей в общем отображении для пары классов. В этой форме Dozer выполняет остальную часть сопоставления и вызывает ваш преобразователь только для поля с пользовательским преобразователем.

<mapping>
    <class-a>ClassA</class-a>
    <class-b>ClassB</class-b>
    <field custom-converter="CustomConverterType1">
        <a>field1</a>
        <b>field1Prime</b>
    </field>
</mapping>
<mapping>
    <class-a>ClassA</class-a>
    <class-b>ClassC</class-b>
    <field custom-converter="CustomConverterType2">
        <a>field1</a>
        <b>field1Prime</b>
    </field>
</mapping>

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

<configuration>
    <custom-converters>
        <converter type="CustomConverterType1">
            <class-a>ClassA</class-a>
            <class-b>ClassB</class-b>
        </converter>
        <converter type="CustomConverterType2">
            <class-a>ClassA</class-a>
            <class-b>ClassC</class-b>
        </converter>
    </custom-converters>
</configuration>

См. Документацию Dozer для получения дополнительной информации о пользовательских преобразователях. https://dozermapper.github.io/user-guide.pdf

...