Java中如何使用MapStruct进行参数化映射?

How to do parameterized mapping using MapStruct in Java?

我有以下实体 class

public class Company {

    private Map<Locale, String> name;

    /* Other fields, getters, setters */
}

和下面的DTO class

public class CompanyHeader {

    private String name;

    /* Other fields, getters, setters */
}

因此,我的实体包含不同语言的名称,我想将其映射到给定的 Locale

这是我的映射器 class

@Mapper
public interface CompanyMapper {

    CompanyHeader entityToHeader(Company company, Locale locale);

    @Named("getByLocale")
    default String getValueByLocale(Map<Locale, String> map, Locale locale) {
        return map.get(locale);
    }
}

现在我的问题是,我应该如何注释我的映射方法,使其将 company 理解为我的源对象,将 getValueByLocale 方法理解为 name 字段的映射方法,和 locale 作为 getValueByLocale 方法的参数?

下面是我如何从外部使用我的映射方法

public Page<CompanyHeader> getCompanies(CompanyFilter companyFilter, Locale locale) {
    Page<Company> companies = getCompanies(companyFilter);
    Page<CompanyHeader> headers = companies.map(company -> companyMapper.entityToHeader(company, locale));

    return headers;
}

您要解决的问题似乎是 @Context.

的一个很好的用法

如果你像这样定义你的映射器

@Mapper
public interface CompanyMapper {

    CompanyHeader entityToHeader(Company company, @Coontext Locale locale);

    default String getValueByLocale(Map<Locale, String> map, @Context Locale locale) {
        return map.get(locale);
    }
}

通过使用 @Context,您告诉 MapStrut 该对象不应被视为映射对象,它可以传递给其他对象。使用此方法,您将能够将所有 Map<Locale, String> 属性映射到 String.

您可以在 Passing context or state objects to custom methods

中阅读有关 @Context 的更多信息