使用mapstruct v1.0.0.Final ,我正面临一个模糊的映射异常,试图从SourceType
映射到TargetType
:
class TargetType {
List<TargetTypeChild> children;
boolean allResults;
}
class SourceType {
List<SourceTypeChild> children;
boolean allResults;
}
我正在使用的映射是:
@Mapper(uses = B.class)
interface A {
@Mapping(target = "children", source = "children", qualifiedBy = ToTargetType.class)
TargetType toTargetType (SourceType source);
@Mapping(target = "children", source = "children", qualifiedBy = ToTargetTypeNoDetails.class)
TargetType toTargetTypeNoDetails (SourceType source);
}
interface B {
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface ToTargetType {}
@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface ToTargetTypeNoDetails {}
@ToTargetType
@IterableMapping(qualifiedBy = ToTargetType.class)
List<TargetTypeChild> withDetails(List<SourceTypeChild> value);
@ToTargetTypeNoDetails
@IterableMapping(qualifiedBy = ToTargetTypeNoDetails.class)
List<TargetTypeChild> noDetails(List<SourceTypeChild> value);
@ToTargetType
@Mappings({
@Mapping(target = "details", source = "details"),
...rest of mapping
})
TargetTypeChild toTargetTypeChild(SourceTypeChild source);
@ToTargetTypeNoDetails
@Mappings({
@Mapping(target = "details", ignore = true),
...rest of mapping
})
TargetTypeChild toTargetTypeChildNoDetails(SourceTypeChild source);
}
这不能编译,在接口A的两个方法中都给出以下异常:
将属性“List children”映射到List的不明确的映射方法:List noDetails(List arg0),List withDetails(List arg0)。
有一个解决方法:将接口A的两个方法放在接口B中。编译并运行。但出于商业原因,我需要将它们分开。
任何人都可以解释为什么第一种方法不起作用以及解决方法呢?
作为一个额外的问题,如果我只编写1个映射方法(没有限定符),我甚至不需要声明@IterableMapping
方法,mapstruct知道如何找到“children”方法。
为什么呢?
谢谢大家!
答案 0 :(得分:2)
任何人都可以解释为什么第一种方法不起作用以及解决方法呢?
您的限定符注释必须至少具有保留策略CLASS
,否则它们将被发现。如果所有内容都在同一个源文件中定义,则不需要这样做,在这种情况下SOURCE
就足够了。
作为奖励问题,如果我只编写1个映射方法(没有限定符)
MapStruct将根据需要生成(私有)可迭代映射方法。实际上它应该也适用于你的原始情况,似乎这是我们需要解决的一个小问题。我已为此提交了问题#707。
感谢你报告这个!