Как создать ConversionServiceAdapter — расширение MapStruct Spring

#java #spring #spring-boot #mapstruct

#java #spring #spring-boot #mapstruct

Вопрос:

Я пытаюсь использовать сборку 0.0.1 расширений MapStruct Spring. Я не могу понять, как будет создан класс ConversionServiceAdapter? На официальном сайте упоминается

 annotations and extensions defined in this project will generate a class acting as bridge between MapStruct’s conventions and Spring’s ConversionService API
 

О каком классе они говорят? Это ConversionServiceAdapter?
Ниже приведены мои классы

 @Getter
@Setter
@FieldNameConstants
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Car {

  private String name;
  private String model;
  private LocalDate year;

  Company company;
}
 
 @Getter
@Setter
@FieldNameConstants
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Company {

  private String companyName;

  private Address address;
}

 

Предположим, что структура CarDto и CompanyDto одинакова.

 @Mapper(config = MapperSpringConfig.class)
public interface CarMapper extends Converter<Car, CarDto> {

  CarDto convert(Car car); 
}
 
 @MapperConfig(componentModel = "spring", uses = ConversionServiceAdapter.class)
public interface MapperSpringConfig {

}
 

Теперь я должен сам создавать класс ConversionServiceAdapter, подобный этому, или он должен быть каким-то образом сгенерирован расширениями Mapstruct spring. Если оно должно быть создано расширением, должен ли я указать uses = ConversionServiceAdapter.class @MapperConfig выше? Как это работает?

 @Component
public class ConversionServiceAdapter {

  @Autowired
  private ConversionService conversionService;

  public CarDto mapCarToCarDto(final Car source) {
    return conversionService.convert(source, CarDto.class);
  }

  public CompanyDto mapCompanyToCompanyDto(final Company source) {
    return conversionService.convert(source, CompanyDto.class);
  }
}

 

Я не смог найти никакой документации или примечаний к выпуску на веб-сайте. На github есть ссылка на примеры, но их недостаточно, и они не объясняют четко, как их использовать.

Пожалуйста, запросите любые детали, которые вам нужны с моей стороны.

Ответ №1:

Прежде всего: спасибо за использование этого небольшого побочного проекта. 🙂

Что касается вашего вопроса: да, это именно то, что проект Spring extensions делает в данный момент: он генерирует класс адаптера. Итак, в вашем MapperSpringConfig uses атрибуте вы можете указать на сгенерированный класс. (Кстати, вам не нужно создавать отдельный класс конфигурации, вы можете с таким же успехом полагаться на отдельные картографы uses . Это было только для иллюстрации.)

Без какой-либо специальной настройки для самого проекта расширений класс адаптера будет сгенерирован с таким именем: org.mapstruct.extensions.spring.converter.ConversionServiceAdapter .

Если вы хотите изменить это, добавьте @SpringMapperConfig аннотацию — см. Этот пример.

А теперь, как сопровождающий проекта, пожалуйста, позвольте мне извиниться за неясное использование. Я все еще работаю над документацией, но на самом деле это основная причина, по которой я присвоил номер версии 0.0.1 . Расширения работают так, как и должно быть. Если у вас возникнут какие-либо проблемы, пожалуйста, не стесняйтесь обращаться к нам по одному из обычных каналов.

Комментарии:

1. Спасибо за быстрый ответ; дело в том, что AdapterClass не генерируется

2. Вам нужен сам процессор MapStruct и проект расширений в качестве зависимости от процессора аннотаций. Как этого добиться, зависит от вашей конкретной конфигурации (Maven / Gradle); но, по сути, везде, где вы в настоящее время добавляете процессор, вы должны добавлять расширения таким же образом.

3. нужно ли нам также добавлять обработчик аннотаций в раздел maven-compiler-plugin? Я пробовал и с этим, и без этого. Добавил @SpringMapperConfig в MapperSpringConfig и указал package и className, но даже тогда класс адаптера не создан.

4. У меня тоже были проблемы с его работой на основе документации. В конце концов, мне не хватало @ComponentScan(«org.mapstruct.extensions.spring»). Возможно, полный, конкретный и дискретный пример в Maven также поможет, потому что все примеры являются Gradle и используют относительные директивы project annotationProcesser, которые не очень похожи на то, как сторонний пользователь Maven будет обрабатывать вещи.

5. Мы добавили некоторую документацию в последнюю версию master. Пожалуйста, не стесняйтесь добавлять вещи, которые, по вашему мнению, отсутствуют, и открывайте PR.