#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.