mapstructはDTOにサブクラスのプロパティをコピーしません。

SaravanaクマールM:

私は、以下の構造を有しています。そして、私のサブクラスのプロパティは私の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());

コントローラには、サブクラスのプロパティをマップしていないsubProperty1subProperty2私にBaseSubDTO

すべてのヘルプは大歓迎です。前もって感謝します。

b0gusb:

ダウンキャストマッピングではまだサポートされていないようです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);

お役に立つといいのですが。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228165&siteId=1