ModelMapper - Как использовать карту (source, destination.class, typeMapName)? - PullRequest
0 голосов
/ 03 июля 2019

Я использую ModelMapper в своем Java-приложении для преобразования DTO в POJO.

У меня есть класс MyObjectDto, который должен быть превращен в MyObject для использования в качестве сущности иотправлено в базу данных.

У меня есть сценарий использования, когда я получаю MyObjectDto со свойством id, которое сообщит моему ORM, что я должен обновить существующую сущность в базе данных.Этот вариант использования работает нормально.

Теперь у меня есть другой вариант использования, когда я получаю тот же MyObjectDto, за исключением того, что я хочу создать новый в базе данных.Я подумал, что единственное, что может сработать, - это использовать конкретное отображение, где я пропускаю свойство id, чтобы мой ORM понимал, что это операция create, а не update.

IЯ думал, что метод, приведенный ниже, решит мою проблему:

public <D> D map(Object source,
                 Class<D> destinationType,
                 String typeMapName)

За исключением того, что я не знаю, как его использовать.До сих пор я пытался сделать это:

    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        TypeMap<MyObjectDto, MyObject> typeMapForNew = modelMapper.createTypeMap(MyObjectDto.class, MyObject.class)
                .addMappings(mapping -> mapping.skip(MyObject::setId));

        return modelMapper;
    }

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

    myObject = modelMapper.map(myObjectDto, MyObject.class, "typeMapForNew");

Спасибо за чтение.

РЕДАКТИРОВАТЬ: для этого конкретного примера, я сделал неправильно в классе конфигурации,Я должен был сделать так:

    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.createTypeMap(MyObjectDto.class, MyObject.class, "typeMapForNew")
                .addMappings(mapping -> mapping.skip(MyObject::setId));

        return modelMapper;
    }

Тогда я могу использовать именованное сопоставление, и оно работает.Теперь мне нужно понять, как я могу пропустить поля идентификаторов моих объектных дочерних объектов.Но на оригинальный вопрос дан ответ.

1 Ответ

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

Следуя рекомендациям REST, вам вообще не следует отправлять id в вашем DTO.

Создать:

@POST
/rest/items
{ ...dto... } -> mapper -> Entity with null id -> save

Обновление:

@PUT
/rest/items/{id}
{ ...dto... } -> mapper -> Entity with null id -> set id from URL -> save
...