2016-04-04 4 views
14

Чтобы отобразить определенный объект mapstruct мне нужно некоторые пользовательские постобработку, которая нуждается дополнительный параметр, чтобы сделать это работа:Карта коллекции с параметром с mapstruct

@Mapper 
public abstract class AlertConfigActionMapper { 

    @Mappings({ @Mapping(target = "label", ignore = true)}) 
    public abstract AlertConfigActionTO map (AlertConfigAction action, Locale userLanguage); 

    @AfterMapping 
    public void setLabel (AlertConfigAction action, @MappingTarget AlertConfigActionTO to, Locale userLanguage) { 
     for (AlertConfigActionLabel label : action.getAlertConfigActionLabels()) { 
      if (label.getLanguage().equals(userLanguage)) { 
       to.setLabel(label.getLabel()); 
       break; 
      } else if (label.getLanguage().equals(Locale.ENGLISH)) { 
       to.setLabel(label.getLabel()); 
      } 
     } 

    } 
} 

Это работает просто отлично. Проблемы начинается, когда я добавляю следующий метод к этому картографу:

public abstract ArrayList<AlertConfigActionTO> mapList (List<AlertConfigAction> actions, Locale userLanguage); 

мне нужно передать этот параметр (UserLanguage), а также, но mapstruct, кажется, «ломается» в данном случае: I генерирует следующий код для этой части (что, естественно, дает ошибку компиляции):

@Override 
public List<AlertConfigActionTO> mapList(List<AlertConfigAction> actions, Locale userLanguage) { 
    if (actions == null && userLanguage == null) { 
     return null; 
    } 

    List<AlertConfigActionTO> list = new List<AlertConfigActionTO>(); 

    return list; 
} 

Я уверен, что это связано с параметром, так как если я удалить его (из всех методов картографирования), то метод MapList правильно генерируется.

Что нужно сделать, чтобы разрешить настраиваемые параметры в этом случае?

ответ

7

Что вы описываете не возможно (все еще). Не могли бы вы открыть запрос функции в нашем issue tracker? Мы должны предоставлять средства для обозначения параметров как своего рода «контекста», который передается по стеку вызовов.

В настоящее время вы можете взглянуть на использование ThreadLocal, которое вы установили перед вызовом процедуры сопоставления и доступ к которой вы получили при настройке после сопоставления. Это не изящно - и вам нужно очистить локальный поток, чтобы избежать утечек памяти, - но он должен сделать трюк.

+0

Спасибо, создал https://github.com/mapstruct/mapstruct/issues/809 –

+0

FYI: Поскольку я уже создал фасад в качестве обертки для фактических карт (чтобы отделить код от фактической реализации картера) Я просто просматриваю список отдельных элементов (AlertConfigAction) и сопоставляю их по отдельности. Всякий раз, когда эта функция будет поддерживаться, я могу просто обновить фасад. –

1

Я не думаю, что это возможно. По крайней мере, не так. Проблема в том, что вы готовите интерфейс/абстрактный класс, а отдых выполняется движком. И этот движок ожидает методов с одним параметром ... Есть декораторы, но они идут одинаково. Я бы попытался ввести язык. Создайте bean-компонент, отметьте его как сеансовое, и узнайте. С Spring вы используете ScopedProxyMode для этого ... Не знаете, как это происходит с CDI.

Другая опция более обходная, затем решение - может быть, что AlertConfigAction может передать эту информацию?