ModelMapper在从字符串转换为ObjectId时发出白色



我有实体(Course)和DTO(CourseDto),弹簧引导作为API服务器,后端作为mongo

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

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

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

我主要在寻找一个通用的解决方案,在这个解决方案中,从String到ObjectId的正确转换会发生(新的ObjectId(myString)),而不会创建新的ObjectId。

提前感谢

您必须使用Converter,因为默认情况下它会生成新的Objectid实例。

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

这是你的转换器,你应该使用类型映射。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。

最新更新