[英]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.