简体   繁体   English

如何在 mapstruct 映射器中使用 spring 注入,存储库 class?

[英]How can I use spring injection, A repository class in a mapstruct mapper?

@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;
}

Using a repository class I have to fetch a StorageDomain object from the ID in BackHalfDomain .使用存储库 class 我必须从 BackHalfDomain 中的 ID 中获取StorageDomain BackHalfDomain So I have to map StorageDomain object with respective fields.所以我必须将 map StorageDomain object 与各自的字段。 like StorgeDomain sd = repo.findById(id).get();StorgeDomain sd = repo.findById(id).get(); and set this sd object in FilesDTO 's xml field and so on.并在FilesDTO的 xml 字段中设置此sd object 等等。 This is my mapper这是我的映射器

@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);

}

I have used uses but wasn't successful.我已经uses过,但没有成功。 I have used @Mapping(target="xyz", expression="java(repo.findById(id))")" but all I got was NullPointerException Spring injection isin't working. Can someone have a solution for this? I am just started with mapstruct我使用@Mapping(target="xyz", expression="java(repo.findById(id))")"但我得到的只是NullPointerException Spring 注入不起作用。有人可以解决这个问题吗?我是刚开始使用mapstruct

Since mapstruct 1.2 you can use a combination of @AfterMapping and @Context.从 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()));
   }
 }

In 1.1 you would need to transform the mapper to a abstract class在 1.1 中,您需要将映射器转换为抽象 class

@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);

}

I ran into this same problem.我遇到了同样的问题。 The solution was to use a Decorator as suggested in this answer .解决方案是按照此答案中的建议使用装饰器。 Following your code, the solution would be something like the following.按照您的代码,解决方案如下所示。

First, we have to specifiy the Decorator in the Mapper:首先,我们必须在映射器中指定装饰器:

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
@Primary
@DecoratedWith(FilesDTOMapperDecorator.class)
public interface FilesDTOMapper {
      // basic mapping here
      public FilesDTO map(BackHalfDomain domain);
}

Then, implement the Decorator:然后,实现装饰器:

public abstract class FilesDTOMapperDecorator implements FilesDTOMapper {

    @Autowired
    @Qualifier("delegate")
    private FilesDTOMapper delegate;

    @Autowired
    private SomeRepository someRepository;

    @Override
    public FilesDTO map(BackHalfDomain domain) {
        // Delegate basic mapping
        FilesDTO filesDTO = delegate.map(domain);

        // Use the repository as needed to set additional mapping
        filesDTO.setSomeValue(repo.findById(id).getSomeValue());

        return filesDTO;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM