我遇到过这样一种情况,我的映射方法有 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
。据我了解,projId
和 code
只是作为映射的助手,它们不用于映射目标属性。
所以你可以做类似的事情(理论上应该可行):
@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/