【问题标题】:How to do parameterized mapping using MapStruct in Java?如何在 Java 中使用 MapStruct 进行参数化映射?
【发布时间】:2018-10-09 09:55:51
【问题描述】:

我有以下实体类

public class Company {

    private Map<Locale, String> name;

    /* Other fields, getters, setters */
}

还有下面的 DTO 类

public class CompanyHeader {

    private String name;

    /* Other fields, getters, setters */
}

所以,我的实体包含不同语言的名称,我想将它映射到给定的Locale

这是我的映射器类

@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;
}

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    您要解决的问题似乎是 @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&lt;Locale, String&gt; 属性映射到String

    您可以在Passing context or state objects to custom methods 中阅读有关@Context 的更多信息

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 2018-03-30
      • 1970-01-01
      • 2016-07-23
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多