mapstruct не копирует свойства подкласса в DTO - PullRequest
2 голосов
/ 21 июня 2019

У меня ниже структура.И свойства из моего подкласса не копируются в мой 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 Mapper
{
    BaseSubDTO toDTO(final BaseClass entity);
}

Строка:

return mapper.toDTO(baseClassService.find());

в контроллере не отображает свойства подкласса subProperty1, subProperty2 к моему BaseSubDTO.

Любая помощь приветствуется.Заранее спасибо.

1 Ответ

2 голосов
/ 21 июня 2019

Похоже, что 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);
    }
}

использование:

SubClass subClass = ...
BaseClass baseClass = ...

ToDTOMapper mapper = ToDTOMapper.MAPPER;
BaseSubDTO dto = mapper.map(subClass);
dto = mapper.map(baseClass);

Надеюсь, это поможет.

...