Как сделать параметризованное отображение, используя MapStruct в Java? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий класс сущностей

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

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

1 Ответ

0 голосов
/ 09 октября 2018

То, что вы пытаетесь решить, выглядит как хорошее применение для @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.

Подробнее о @Context можно прочитать в Передача объектов контекста или состояния в пользовательские методы

...