@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
中的 ID 获取 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
弹簧注入不起作用。
有人可以解决这个问题吗?我刚刚开始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);
}
我遇到了同样的问题。解决方案是按照这个答案中的建议使用装饰器。按照您的代码,解决方案将类似于以下内容。
首先,我们必须在Mapper中指定Decorator:
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
@Primary
@DecoratedWith(FilesDTOMapperDecorator.class)
public interface FilesDTOMapper {
// basic mapping here
public FilesDTO map(BackHalfDomain domain);
}
然后,实现装饰器:
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;
}
}
您需要像 bean 一样将映射器注入到服务中。