2016-08-06 7 views
3

Мне нужно, чтобы ввести класс весной служб в создаваемой реализации картографа, так что я могу использовать его с помощьюMapstruct - Как я могу придать пружинную зависимость в сгенерированном классе Mapper

@Mapping(target="x", expression="java(myservice.findById(id))")" 

Является ли это применимо в Mapstruct -1,0?

ответ

3

Это должно быть возможным, если вы объявляете Spring в качестве компонентной модели и добавить ссылку на тип myservice:

@Mapper(componentModel="spring", uses=MyService.class) 
public interface MyMapper { ... } 

Этот механизм предназначен для обеспечения доступа к другим методам отображения, чтобы назвать генерируемой кодом , но вы также сможете использовать их в выражении так же. Просто убедитесь, что вы используете правильное имя сгенерированного поля с ссылкой на службу.

+0

У меня такая же проблема, и кажется, что классы, объявленные с помощью 'uses', будут только автообновлены, если один из их методов используется в качестве целевого сопоставления source->, поэтому, если их использование будет только в выражении, то они будут * not * get autowired –

+2

А, это интересный момент, если вы * только * хотите использовать его в выражении. Не могли бы вы открыть проблему в нашем трекере (https://github.com/mapstruct/mapstruct/issues)? Благодаря! – Gunnar

4

Как прокомментировал brettanomyces, служба не будет введена, если она не используется в операциях сопоставления, отличных от выражений.

Единственный способ я нашел это:

  • Transform мой интерфейс сопоставителя в абстрактный класс
  • Вводить службу в абстрактном классе
  • Сделать это защищало так что «осуществления» абстрактный класс имеет доступ

я использую CDI, но это должно быть плохо обожженный с весной:

@Mapper(
     unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE, 
     componentModel = "spring", 
     uses = { 
      // My other mappers... 
     }) 
public abstract class MyMapper { 

    @Autowired 
    protected MyService myService; 

    @Mappings({ 
     @Mapping(target="x", expression="java(myservice.findById(obj.getId()))")") 
    }) 
    public abstract Dto myMappingMethod(obj); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^