MapStruct 不复制子类属性

Sar*_* MB 5 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);
}
Run Code Online (Sandbox Code Playgroud)

该行:

return mapper.toDTO(baseClassService.find());
Run Code Online (Sandbox Code Playgroud)

在控制器中没有将子类属性映射subProperty1subProperty2我的BaseSubDTO.

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

b0g*_*usb 4

似乎还不支持 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)

希望有帮助。