java - 如何使用 spring 注入,mapstruct 映射器中的存储库类?
问题描述
@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
对象设置在FilesDTO
的 xml 字段中,依此类推。这是我的映射器
@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
解决方案
从 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);
}
推荐阅读
- python-3.x - 管理面板中的 CSRF 验证失败
- reactjs - 尽管它是只读的,但反应道具值会发生变化
- clojure - 如何从 Clojure 中的字符串中获取变量的值?
- gradle - CLI运行多个项目的gradle依赖任务
- android - 在 Android Automotive Emulator 中使用 Android Auto App
- gatling - 获取 java.lang.ClassNotFoundException Gatling - 运行 Gatling 时
- php - PHP 7.4.18 更新:Mysqlnd -- 在 fetch 之后调用 stmt_store_result 现在会引发错误
- python - 我的这段代码的意图是在产品数量小于零或等于零但电子邮件没有收到时发送电子邮件
- c - 我正在尝试交换整数的第一个和最后一个整数,但是当我输入 1234 时,输出为 1351
- django-forms - 如何使用外键保存 django 表单