ModelMapper выдает белое преобразование из строки в ObjectId

У меня есть Entity (Course) и DTO (CourseDto) с весенней загрузкой в ​​качестве сервера API, бэкэнд как mongo

@Document(collection = "courses")
public class Course {
     @Id private ObjectId id;
     ....
}

public class CourseDto {
  private String id; 
  ....
}

Я использую modelmapper для преобразования из CourseDto в Course и наоборот. Преобразование из идентификатора курса (ObjectId) в идентификатор курса (String) происходит правильно (аналогично course.getId (). ToHexString ()). Это дает мне шестнадцатеричную строку. Но когда я пытаюсь преобразовать из CourseDto в Course (String id в ObjectId), создается совершенно новый ObjectId.

Я знаю, что могу использовать конвертер, но это применимо для всех моих 50+ классов сущностей + также для глубоких вложенных объектов. Например. Курс содержит список тем, и каждая тема содержит список идентификаторов статей (List of ObjectId). Насколько мне известно, я могу прикрепить преобразованный к конкретному картографу модели (в данном случае к картографу модели курса)

В основном я ищу общее решение, в котором произойдет правильное преобразование из String в ObjectId (новый ObjectId (myString)), а новый ObjectId не будет создан.

заранее спасибо


person user2869612    schedule 09.02.2019    source источник


Ответы (1)


Вы должны использовать Converter, потому что по умолчанию он создает новый экземпляр Objectid.

Converter<String, ObjectId> toObjectId = new AbstractConverter<String, ObjectId>() {
    protected ObjectId convert(String source) {
        return source == null ? null : new ObjectId(source);
    }
};

Это ваш конвертер, и вы должны использовать typemap. Crete modelmapper bean, как показано ниже.

@Bean
    public ModelMapper modelMapper() {

        Converter<String, ObjectId> toObjectId = new AbstractConverter<String, ObjectId>() {
            protected ObjectId convert(String source) {
                return source == null ? null : new ObjectId(source);
            }
        };

        TypeMap<EventMessageModel, Message> typeMap1 = modelMapper.createTypeMap(EventMessageModel.class, Message.class);
        typeMap1.addMappings(mapper -> {
             mapper.using(toObjectId)
            .map(EventMessageModel::getToUserId, Message::setToUserId);

             mapper.using(toObjectId)
            .map(EventMessageModel::getFromUserId, Message::setFromUserId);

        });

        return modelMapper;
    }

Это моя реализация. Вы должны написать свою реализацию.

Если в классе все строки должны отображать Objectid, вы можете напрямую использовать, как показано ниже

TypeMap<EventMessageModel, Message> typeMap1 = modelMapper.createTypeMap(EventMessageModel.class, Message.class);

typeMap1.setPropertyConverter(toObjectId);

Это преобразует всю строку в идентификатор объекта в классе.

person güven seckin    schedule 19.01.2020
comment
да, его рабочее решение. - person radekdob; 10.03.2021