java - 具有多个参数的 MapStruct QualifiedByName

标签 java intellij-idea java-8 mapstruct

我遇到过这样一种情况,我的映射方法有 3 个参数,所有这三个参数都用于派生目标类型的一个属性。

我在接口(interface)中创建了一个默认映射方法,保留派生属性的逻辑,现在为了调用这个方法,我可以使用 expression = "java( /*method call here*/ )"@Mapping注解。

有没有办法用像 @qualifiedByName 这样的任何 mapstruct 注释来做到这一点? ,我尝试注释具有表达式属性的注释并使用了 qualifiedByName,但它不起作用:

@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    //@Mapping(target="qualified",expression = "java( checkQualified (one, projId, code) )")
    @Mapping(target="qualified",qualifiedByName="checkQualifiedNamed")
    OneDto createOne (One one, Integer projId, Integer val, String code);

    @Named("checkQualifiedNamed")
    default Boolean checkQualified (One one, Integer projId, Integer val, String code) {
        if(one.getProjectId() == projId && one.getVal() == val && one.getCode().equalsIgnoreCase(code)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;                   
    }
}

最佳答案

目前 MapStruct 不支持具有多个源属性的映射方法。

但是,在您的情况下,您可以使用 1.2.0 中的 @Context。据我了解,projIdcode 只是作为映射的助手,它们不用于映射目标属性。

所以你可以做类似的事情(理论上应该可行):

@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed")
    OneDto createOne (One one, @Context Integer projId, @Context String code);

    @Named("checkQualifiedNamed")
    default Boolean checkQualified (One one, @Context Integer projId, @Context String code) {
        if(one.getProjectId() == projId && one.getCode().equalsIgnoreCase(code)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;                   
    }
}

另一种方法是将所有这些属性提取到一个单独的类中并将其传递(这将允许同一类型的多个参数)。

类看起来像:

public class Filter {

    private final Integer projId;
    private final Integer val;
    private final String code;

    public Filter (Integer projId, Integer val, String code) {
        this.projId = projId;
        this.val = val;
        this.code = code;
    }

    //getters
}

您的映射器将如下所示:

@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    @Mapping(target="qualified", qualifiedByName="checkQualifiedNamed")
    OneDto createOne (One one, @Context Filter filter);

    @Named("checkQualifiedNamed")
    default Boolean checkQualified (One one, @Context Filter filter) {
        if(one.getProjectId() == filter.getProjId() && one.getVal() == filter.getVal() && one.getCode().equalsIgnoreCase(filter.getCode())) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;                   
    }
}

然后您可以像这样调用映射器:mapper.createOne(one, new Filter(projId, val, code));

关于java - 具有多个参数的 MapStruct QualifiedByName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47694501/

相关文章:

java - Android JSON 字符处未终止的字符串

java - 用java开发高负载站点

java - 迭代反射的子类,变量似乎没有阴影,IntelliJ 似乎有冲突

java - 使用 Fiddler 捕获 HTTP 流量

Java8 使用 lambda 将方法作为参数传递

java - 如何在Android Studio项目中设置Java库的源版本

java - 使用非最终变量将 Java Map.Entry 传输到 Stream

java - 为什么不能调整数组的大小?

java - Android 中的 Assets 是什么?

java - IntelliJ 似乎使用 javac 而不是 groovyc 来处理 groovy 文件?