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

问题描述 投票:0回答:1

我有以下映射器接口:

@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的不明确的映射方法:boolean MapperClassA.isAllowed(java.lang.String id),boolean MapperClassA.isSafe(java.lang.String id) 。

如果我将@Named添加到两个方法,那么代码编译就好了。但是,我不明白为什么它甚至会在MapperClassA中查找这些方法。根据MapStruct文档:

当目标类型是基元类型或盒装类型时,String值是文字的。 ...在所有其他情况下,常量或默认值可通过内置转换或其他映射方法的调用进行类型转换,以匹配目标属性所需的类型。

在这种情况下,'allowed'是Target类中的布尔属性。那么它应该只取String值吗?而不是尝试在映射器中调用方法。

有谁可以解释为什么它不只是使用'Boolean.FALSE'?

java mapstruct
1个回答
1
投票

尝试

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

所以没有你的映射方法。

问题

  1. 用户可以覆盖MapStruct中的默认值。因此MapStruct将首先查找符合条件的映射方法:boolean - > String。然后它会尝试类型转换(内部)。
  2. MapStruct 1.3引入了普通常量。因此MapStruct将识别您的“true”并将其作为文字放在生成的映射器中。
© www.soinside.com 2019 - 2024. All rights reserved.