3

我找到了这个关于使用 Qualifier 的 Iterable 到 Non-Iterable 映射的示例:

https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable

但是如何使这个映射能够映射嵌套属性(使用点注释)?

例如,将源对象中集合的第一个元素的字段 xyz 映射到目标对象上的普通字段?

该示例定义了一个限定符

@Qualifier  
@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.SOURCE)  
public @interface FirstElement {
}

然后定义一个自定义映射器

public class MapperUtils {
    @FirstElement
    public <T> T first(List<T> in) {
        if (in != null && !in.isEmpty()) {
            return in.get(0);
        }
        else {
            return null;
        }
    }
}

最后,映射定义为

@Mapping(target = "emailaddress", source = "emails", qualifiedBy = FirstElement.class )

但是,如果我想从电子邮件集合的第一个元素中提取特定字段,例如我会使用代码完成emails.get(0).getEmailAddress吗?

例如,我希望编写这样的映射:

@Mapping(target = "emailaddress", source = "emails[0].emailAddress")
4

2 回答 2

2

你只需要改变MapperUtils

public class MapperUtils {
    @FirstElement
    public String firstEmailAddress(List<Person> in) {
        if (in != null && !in.isEmpty()) {
            return in.get(0).getEmailAddress();
        }
        else {
            return null;
       }
    }
}

基本上 Annotated 方法的参数应该具有Iterable您想要映射的那个,并且返回类型应该是Non-Iterable您想要映射到的那个。

如果您不想为映射创建自定义映射,另一种方法是使用该expression属性。

例如:

@Mapping(target = "emailaddress", expression = "emails != null && !emails.isEmpty() ? emails.get(0).getEmailAddress() : null")

但是,如果您犯了错误,请小心使用表达式可能会导致编译时问题。MapStruct 不检查表达式的有效性并按原样使用它。

于 2016-12-05T21:46:12.917 回答
0

另一种选择是在您的映射器中使用以下行这使用帮助器类来帮助转换

@Mapping(target = "emailaddress", qualifiedByName={"helperClass", "emailsToAddress"}, 
source = "emails")

在 @Mapper 的组件使用部分中添加 helperclass

@Mapper(        
        componentModel="spring",
        uses ={                 
                helperClass.class
       },               
       ) 

助手类看起来像

@Component
@Named("helperClass")
public class helperClass {      

@Named("emailsToAddress")
    public String emailsToAddress(List<Email> emails) {
        if(emails != null || !emails.isEmpty )
            return emails.get(0).getAddress();
        else
            return null;
    }   
于 2018-06-14T11:26:09.260 回答