@Mapping mapstruct 与列表<>列表<>



我最近开始使用mapstruct,在编码时我坚持使用一个场景。为了解决以下默认方法之间的歧义,我尝试使用" qualiedby">

@Mapping(qualifiedBy = LineTestBO). Line => 1
List<ReturnABO> toCaptureLineItemsBOs(List<LineDTO> lineDTO);
@Named("LineTestBO")
default ReturnABO map(LineDTO lineDTO) {
if (lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null &&
lineDTO.getAmount() != null && lineDTO != null)
return this.toBO(lineDTO);
return null;
}
default returnABO toBO(LineDTO lineDTO)  {
// To do here
}

但是第1行显示了错误,因为它需要"target"待指定。我不确定这里的目标应该是什么,因为Line是一个集合对象。即使我不使用@mapping, mapstuct也会生成映射器实现。我阅读了mapstuct文档,但对于这个场景无法理解。如何在List上使用Named注释来显式地表示要使用的名称?有人能帮帮我吗?谢谢。

出现这个错误的原因是在可迭代映射方法上使用@Mapping没有多大意义。

您要找的是IterableMapping#qualifiedBy

那么在你的例子中,映射器应该是这样的:

@Mapper
public interface MyMapper {
@IterableMapping(qualifiedByName = "LineTestBO")
List<ReturnABO> toCaptureLineItemsBOs(List<LineDTO> lineDTO);
@Named("LineTestBO")
default ReturnABO map(LineDTO lineDTO) {
if (lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null && lineDTO.getAmount() != null && lineDTO != null) {
return this.toBO(lineDTO);
}

return null;
}
default returnABO toBO(LineDTO lineDTO)  {
// To do here
}
}

必须指定目标,所以如果您的pojo看起来像这样

class A {
private List<ReturnABO> x;
}
class B {
private List<LineDTO> x;
}

在你的映射器中,你可以这样写

interface AMapper {
@Mapping(target="x", source="x", qualifiedByName = "LineTestBO")
A toA(B b);
@Named("LineTestBO")
default List<ReturnABO> lineTestBO (List<LineDTO> lines) {
return lines.stream().map(this::map).collect(Collectors.toList())
} 
default ReturnABO map(LineDTO lineDTO) {
if (lineDTO.getCurrency() != null && lineDTO.getNationalPermit() != null &&
lineDTO.getAmount() != null && lineDTO != null)
return this.toBO(lineDTO);
return null;
}
}

相关内容

  • 没有找到相关文章

最新更新