ModelMapper问题白色从字符串转换为ObjectId

时间:2019-02-09 06:35:51

标签: java modelmapper

我有Entity(课程)和DTO(CourseDto),其中Spring Boot是API服务器,后端是mongo

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

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

我正在使用modelmapper从CourseDto转换为Course,反之亦然。从课程ID(ObjectId)到CourseD到ID(String)的转换正确进行(类似于course.getId()。toHexString())。它给了我六角弦。但是,当我尝试从CourseDto转换为Course(从字符串ID到ObjectId)时,就会生成全新的ObjectId。

我知道我可以使用转换器,但是考虑到我所有的50多个实体类以及深层嵌套对象,这也是适用的。例如。课程包含主题列表,每个主题均包含文章ID(ObjectId列表)列表。据我所知,我可以将转换后的附加到特定的模型映射器(在这种情况下,附加到课程模型映射器)

我主要是在寻找一种通用的解决方案,在该解决方案中会发生从String到ObjectId的正确转换(new ObjectId(myString)),并且不会创建新的ObjectId。

预先感谢

1 个答案:

答案 0 :(得分:0)

您必须使用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);

这会将所有字符串转换为类中的对象ID。