ModelMapper: выберите сопоставление на основе дочернего класса.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ModelMapper: выберите сопоставление на основе дочернего класса.

Сообщение Anonymous »


TL;DR

Я хочу использовать modelMapper таким образом, чтобы я сопоставлял AbstractParent с AbstractParentDTO, а затем в ModelMapper-Config вызывал определенные преобразователи для каждого подкласса, а затем пропускал остальные сопоставления (абстрак-класса).
р>
Как это возможно? Это правильный подход? Есть ли ошибка в дизайне?

Что у меня есть:

Родительский объект:

@Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn (имя = «тип») публичный абстрактный класс Parent { //еще несколько полей } Один дочерний объект:

//Базовые аннотации Ломбок @DiscriminatorValue("child_a") общественный класс ChildA расширяет Parent { //еще несколько полей } Другой дочерний объект:

@DiscriminatorValue("child_b") общественный класс ChildB расширяет Parent { //еще несколько полей } Затем у меня есть родительский класс DTO:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME) @JsonSubTypes({ @JsonSubTypes.Type(value = ChildA.class, name = "child_a"), @JsonSubTypes.Type(value = ChildB.class, name = "child_b"), публичный абстрактный класс ParentDTO { //еще несколько полей } Один дочерний DTO:

публичный класс ClassADTO расширяет ParentDTO { //еще несколько полей } и еще один DTO:

публичный класс ClassBDTO расширяет ParentDTO { //еще несколько полей } В моем случае я получаю DTO от контроллера и сопоставляю их с объектами при передаче их в Службу. Мне придется сделать то же самое в 5-6 конечных точках.

Конечные точки выглядят примерно так:

@PreAuthorize(CAN_WRITE) @PutMapping("/{id}") общедоступное обновление ResponseEntity( @PathVariable("id") идентификатор UUID, @RequestBody @Valid ParentDTO родительDTO) { Родитель-родитель = родительскийService.update(id, родительскийDTO); if (parentDTO экземпляр ChildADTO) { return ResponseEntity.ok(modelMapper.map(parent, ChildADTO.class)); } else if (parentDTO экземпляр ChildBDTO) { return ResponseEntity.ok(modelMapper.map(parent, ChildBDTO.class)); } throw new BadRequestException("Родительский объект недействителен"); } Только у меня есть еще несколько Чайлдов, которые делают вещи еще громоздкими.

Чего я хочу:

Вместо того, чтобы кучу раз проверять, какой экземпляр представляет собой DTO (или Entity), я просто хочу написать, например:

modelmapper.map(родительский, ParentDTO.class) и выполните проверку «экземпляр...» ОДИН РАЗ в моей конфигурации ModelMapper.

Что я пробовал:

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

Я попытался решить свою проблему, написав еще один преобразователь для родительских классов и установив его в качестве предварительного преобразователя ModelMapper:

//от сущности к DTO Converter родительскийParentDTOConverter = MappingContext -> { Родительский источник = MappingContext.getSource(); ParentDTO dest = MappingContext.getDestination(); if (исходный экземпляр CHildA) { return modelMapper.map(dest, ChildADTO.class); } else if (исходный экземпляр ChildB) { return modelMapper.map(dest, ChildBDTO.class); } вернуть ноль; }; и:

modelMapper.createTypeMap(Parent.class, ParentDTO.class) .setPreConverter(parentParentDTOConverter); Но я всегда получаю одну и ту же ошибку MappingError:

1) Не удалось создать экземпляр пункта назначения. com.myexample.data.dto.ParentDTO. Гарантировать, что com.myexample.data.dto.ParentDTOO имеет частный аргумент без аргументов конструктор.

что я получаю (я думаю), я не могу создать объект абстрактного класса. Но это не то, что я пытаюсь сделать, не так ли? Я предполагаю, что modelMapper все еще выполняет остальную часть картографирования после завершения работы с моим PreConverter. Я также пытался установить его с помощью .setConverter, но всегда с тем же результатом.
[*]
Кто-нибудь знает, как «отключить» пользовательские сопоставления? Я не очень хочу написать «псевдо-картографы», которые действуют как картографы и просто вызовите конкретных картографов для каждого сценария.
[*]
Мой дизайн просто плох? Как бы вы его улучшили?
[*]
Это еще не реализовано в ModelMapper?

Любая помощь и подсказки приветствуются.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»