spring - 如何创建从实体到 dto 的映射器,其中 dto 嵌套在哪里?
问题描述
给出了具有相应 dto 的两个实体
实体:
class GalleryBlock(
var images: List<Image?>,
override val sortIndex: Int = 0,
) : ArticleBlock(sortIndex)
class Image(
var url: String,
var imageSize: ImageSize,
override var id: Long,
override var lastModified: Date,
override var lastModifiedBy: String? = null ) : DBEntity
enum class ImageSize {
SMALL,
MEDIUM,
LARGE, }
dtos
data class GalleryBlockDto(
var images: List<ImageDto>,
override val sortIndex: Int,
) : ArticleBlockDto
data class ImageDto(
var id: Long,
var url: String,
var imageSize: ImageSize,
)
对于映射,我编写了一个接口 Mapper
interface Mapper<E, D> {
fun fromEntity(entity: E): D
}
对于从类 Image 到 ImageDto 的映射,我创建了一个类 ImageMapper
@Component
class ImageMapper: Mapper<Image, ImageDto> {
override fun fromEntity(entity: Image): ImageDto {
return ImageDto(entity.id, entity.url, entity.imageSize)
}
}
在映射 GalleryBlock 时,我做了同样的事情,但我得到了类型不匹配。
@Component
class GalleryBlockMapper: Mapper<GalleryBlock, GalleryBlockDto> {
override fun fromEntity(entity: GalleryBlock): GalleryBlockDto {
val images = entity.images
val sortIndex = entity.sortIndex
return GalleryBlockDto(images, sortIndex)
}
}
我的方法正确吗?以及如何在不更改 Dto 和实体的字段的情况下修复类型不匹配?
解决方案
在您的 GalleryBlockMapper 中,您将 Image 实例传递给 GalleryBlockDto。但是需要 ImageDto 实例。需要将 ImageMapper 注入到 GalleryBlockMapper 中,这样才能映射图像。
@Component
class GalleryBlockMapper(private val imageMapper: ImageMapper): Mapper<GalleryBlock, GalleryBlockDto> {
override fun fromEntity(entity: GalleryBlock): GalleryBlockDto {
val images = entity.images.map { imageMapper.fromEntity(it) }
val sortIndex = entity.sortIndex
return GalleryBlockDto(images, sortIndex)
}
}
推荐阅读
- php - Symfony:从 postgresql 获取时吃掉我所有的 ram
- android - 如何确保Android中只有一个给定的活动?
- python - 如何在python中为类对象定义绑定?
- reactjs - 如何从 firebase 中的每个文档中获取每个集合?(反应)
- android - Android 布局抛出错误索引:0,大小:0
- powerbi - PowerBI 为表 B 中的每个日期重复表 A 中的行
- django - 在 Django 中使用 Plotly 绘制图像
- r - 股份变动百分比
- java - 如何在多模块maven项目中单独构建模块?
- arrays - Mybatis - 将字符串 [] 传递给 Oracle 存储过程