当mapperclass有多个具有常量返回类型的方法时,常量不起作用

时间:2019-02-21 10:50:23

标签: java mapstruct

我具有以下映射器界面:

@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'吗?

1 个答案:

答案 0 :(得分:1)

尝试

@Mapper(componentModel = "spring" )
public interface SourceTargetMapper {
    @Mapping(target = "allowed", constant = "false")
    Target toTarget(final Source );
}

所以没有您的映射方法。

问题

  1. 用户可以覆盖MapStruct中的默认值。因此,MapStruct首先将寻找满足以下条件的映射方法:布尔值->字符串。然后它将尝试类型转换(内部)。

  2. MapStruct 1.3引入了普通常量。因此,MapStruct将识别您的“ true”,并将其作为文字放入生成的映射器中。