java - MapStruct 不复制子类属性
问题描述
我有以下结构。我的子类中的属性没有被复制到我的 DTO。
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
class BaseClass
{
private Integer baseProperty1;
private Integer baseProperty2;
//getters & setters
}
class SubClass extends BaseClass
{
private Integer subProperty1;
private Integer subProperty2;
//getters & setters
}
class BaseSubDTO
{
private Integer baseProperty1;
private Integer baseProperty2;
private Integer subProperty1;
private Integer subProperty2;
//getters & setters
}
class BaseClassService
{
public BaseClass find()
{
return baseClassRepository.findById(101);
}
}
class BaseClassController
{
public BaseSubDTO find()
{
return mapper.toDTO(baseClassService.find());
}
}
@Mapper(componentModel = "spring")
public interface DTOMapper
{
BaseSubDTO toDTO(final BaseClass entity);
}
该行:
return mapper.toDTO(baseClassService.find());
在控制器中没有将子类属性映射到我subProperty1
的.subProperty2
BaseSubDTO
子类属性如何映射到 DTO 中?
解决方案
似乎尚不支持向下转换映射mapstruct
。请参阅对类型细化映射(或向下转换映射)的支持
为了保持通用性,您可以实现一个自定义映射器来检查传入对象的类型:
@Mapper
public interface ToDTOMapper {
ToDTOMapper MAPPER = Mappers.getMapper(ToDTOMapper.class);
BaseSubDTO toDTOFromBaseClass(BaseClass baseClass);
BaseSubDTO toDTOFromSubClass(SubClass baseClass);
default BaseSubDTO map(BaseClass baseClass) {
if(baseClass instanceof SubClass) {
return toDTOFromSubClass((SubClass)baseClass);
}
return toDTOFromBaseClass(baseClass);
}
}
用法:
SubClass subClass = ...
BaseClass baseClass = ...
ToDTOMapper mapper = ToDTOMapper.MAPPER;
BaseSubDTO dto = mapper.map(subClass);
dto = mapper.map(baseClass);
希望有帮助。
推荐阅读
- c++ - 这个 size_t 的语法是什么意思?
- javascript - 如何使用 sheetJS 和节点读取上传文件的工作表数据?
- idl - 在 Ubuntu 20 上的 GDL 中定义函数时出错
- amazon-web-services - 在不下载大 zip 文件的情况下读取 Amazon S3 上 .zip 文件中的 xml 文件?
- git - 如果我忘记推送提交并从本地开发分支创建功能分支,如何解决 GIT 冲突?
- groovy - 在 jenkinsfile 中使用 makrup 发布链接
- symfony - 从 MappedSuperClass 到实体的教义关系
- python - 使用散点图可视化列表字典中的数据
- wordpress - 单个自定义帖子类型模板(使用 Timber/Twig 的 WordPress)不起作用
- merge - 为数据集 A 中的每个变量复制数据集 B