Как создать вид для автоматического преобразования модели по вызову веб-сервиса? - PullRequest
0 голосов
/ 12 июля 2019

У меня есть веб-приложение, в котором пользовательский клиент вызывает веб-службу (давайте назовем ее svc1 ), которая, в свою очередь, вызывает другую веб-службу ( svc2 ) для получения некоторых данных.

Пользовательский интерфейс отправляет входной DTO на svc1 , который преобразует его во входную МОДЕЛЬ для svc2 , svc2 , а затем возвращает выходную МОДЕЛЬ на svc1 который конвертируется в выходной DTO для отправки в браузер.

Код SVC1 реализован следующим образом:

public OutputDto svc1(InputDto dto1){
    InputModel model1 = inputAssembler.convertViewToModel(dto1);
    Output model2 = svc2.call(model1);
    return outputAssembler.convertModelToView(model2);
}

Я хочу знать, как реализовать дизайн, который будет заботиться о вызове convertViewToModel() и convertModelToView() каждый раз, когда выполняется метод svc1 . У меня есть дизайн таким образом, что у каждой пары Model / View есть класс Assembler (Mapper), который имеет два метода с именами convertViewToModel() и convertModelToView()

interface Assembler<S,T>{ 
    S convertModelToView(T t);
    T convertViewToModel(S s);
}

class InputAssembler<InputDto, InputModel> implements Assembler{
    ....
}

Я думаю об АОП, но думаю, что что-то упустил.

1 Ответ

0 голосов
/ 12 июля 2019

Вы можете попробовать использовать простую зависимость отображения, такую ​​как MapStruct , в которой есть функции, автоматически отображающие между двумя Java-компонентами. Это особенно полезно в тех случаях, когда для преобразования одного из них требуется много кода платформы. ДТО моделировать и наоборот.

Дополнительным преимуществом является то, что Mapstruct имеет встроенную поддержку пружины и Dependency Injection.

Необходимая зависимость:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.3.0.Beta2</version> 
</dependency>

Также позаботьтесь о том, чтобы включить плагин mapstruct-processor в pom.

Тогда вы можете предоставить интерфейс, подобный (не точный, поскольку я не знаю ваш класс и поля dto):

@Mapper public interface OutputMapper {
    @Mappings({
      @Mapping(target="id", source="input.id"),
      @Mapping(target="name", source="input.name")
    })
    EmployeeDTO inputToOutputDTO(Input entity);
    @Mappings({
      @Mapping(target="id", source="dto.id"),
      @Mapping(target="name", source="dto.name")
    })
    Employee outputDTOtoInput(OutputDTO dto); }

Но для вашего случая использования, я думаю, вам нужно будет использовать универсальные преобразователи типов. Вам нужно будет использовать java-шаблоны для определения универсальных конвертеров для каждого типа объекта. Один из примеров: i found .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...