我有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。
预先感谢
答案 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。