我具有以下映射器界面:
@Mapper(componentModel = "spring", uses = {
MapperClassA.class
})
public interface SourceTargetMapper {
@Mapping(target = "allowed", constant = "Boolean.FALSE")
Target toTarget(final Source );
}
MapperClassA具有以下方法:
public static boolean isAllowed(final String id) {
// implementation
}
public static boolean isSafe(final String id) {
// implementation
}
运行全新安装时,出现以下错误:
SourceTargetMapper.java:发现了用于映射的模糊映射方法 常量'“ Boolean.FALSE”'到java.lang.Boolean:布尔值 MapperClassA.isAllowed(java.lang.String id),布尔值 MapperClassA.isSafe(java.lang.String id)。
如果将@Named添加到两个方法中,则代码可以正常编译。但是,我不明白为什么它甚至开始寻找MapperClassA中的那些方法。根据MapStruct文档:
当目标类型是基本类型或盒装类型时,String值 按字面意思。 ...在所有其他情况下,常数或默认值为 可以通过内置转换或 调用其他映射方法以匹配类型 目标属性所必需。
在这种情况下,“允许”是Target类中的布尔属性。因此,它应该只采用String值正确吗?而不是尝试在映射器中调用方法。
任何人都可以解释为什么不仅仅使用'Boolean.FALSE'吗?
答案 0 :(得分:1)
尝试
@Mapper(componentModel = "spring" )
public interface SourceTargetMapper {
@Mapping(target = "allowed", constant = "false")
Target toTarget(final Source );
}
所以没有您的映射方法。
问题
用户可以覆盖MapStruct中的默认值。因此,MapStruct首先将寻找满足以下条件的映射方法:布尔值->字符串。然后它将尝试类型转换(内部)。
MapStruct 1.3引入了普通常量。因此,MapStruct将识别您的“ true”,并将其作为文字放入生成的映射器中。