我有以下结构。我的子类中的属性不会复制到我的 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);
}
Run Code Online (Sandbox Code Playgroud)
该行:
return mapper.toDTO(baseClassService.find());
Run Code Online (Sandbox Code Playgroud)
在控制器中没有将子类属性映射subProperty1到subProperty2我的BaseSubDTO.
子类属性如何映射到DTO中?
似乎还不支持 Downcast Mapping 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);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
SubClass subClass = ...
BaseClass baseClass = ...
ToDTOMapper mapper = ToDTOMapper.MAPPER;
BaseSubDTO dto = mapper.map(subClass);
dto = mapper.map(baseClass);
Run Code Online (Sandbox Code Playgroud)
希望有帮助。