首页 > 解决方案 > 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的.subProperty2BaseSubDTO

子类属性如何映射到 DTO 中?

标签: javamapstruct

解决方案


似乎尚不支持向下转换映射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);

希望有帮助。


推荐阅读