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
的更多信息
我有以下实体 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
的更多信息