Как я могу использовать Spring инъекцию, класс репозитория в картографе mapstruct? - PullRequest
0 голосов
/ 04 августа 2020
@Data
public class FilesDTO {

    private int issue;
    private String uniqueStr;
    private StorageDomain xml;
    private StorageDomain pdf;
    private StorageDomain stop;
}
@Data
public class BackHalfDomain {
    private int articleId;
    private String uniqueStrr;
    private long xmlContentId;
    private long pdfContentId;
    private long stopId;
    private int issueNumber;
}

Используя класс репозитория, мне нужно получить объект StorageDomain из идентификатора в BackHalfDomain. Поэтому мне нужно сопоставить объект StorageDomain с соответствующими полями. например, StorgeDomain sd = repo.findById(id).get(); и установите этот объект sd в поле xml FilesDTO и так далее. Это мой маппер

@Mapper(componentModel = "spring")
public interface FilesDTOMapper {

    public static final FilesDTOMapper fileDTOMapper = Mappers.getMapper(FilesDTOMapper.class);

    @Mapping(target = "issue", source = "domain.issueNumber")
    @Mapping(target = "DOI", source = "domain.doi")
    public FilesDTO map(BackHalfDomain domain);

}

Я использовал uses, но безуспешно. Я использовал @Mapping(target="xyz", expression="java(repo.findById(id))")", но все, что у меня было, было NullPointerException Spring Injection не работает. Может у кого-нибудь есть решение для этого? Я только начал с mapstruct

1 Ответ

0 голосов
/ 04 августа 2020

Начиная с mapstruct 1.2, вы можете использовать комбинацию @AfterMapping и @ Context.

@Mapper(componentModel="spring")
public interface FilesDTOMapper { 

   @Mapping(target = "xyz", ignore = true)
   @Mapping(target = "issue", source = "domain.issueNumber")
   @Mapping(target = "DOI", source = "domain.doi")
   FilesDTO map( BackHalfDomain domain, @Context MyRepo repo);

   @AfterMapping
   default void map( @MappingTarget FilesDTO target, BackHalfDomain domain, @Context MyRepo repo) {
        target.setXYZ(repo.findById(domain.getId()));
   }
 }

В 1.1 вам нужно будет преобразовать сопоставитель в абстрактный класс

@Mapper(unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE,
        componentModel = "spring",
        uses = {})
public abstract class FilesDTOMapper {

    @Autowired
    protected MyRepo repo;


    @Mapping(target = "issue", source = "domain.issueNumber")
    @Mapping(target = "DOI", source = "domain.doi")
    @Mapping(target="xyz", expression="java(repo.findById(domain.getId())))")
    public FilesDTO map(BackHalfDomain domain);

}
...