Как я могу объединить Guice и Mapstruct?
Я использую Джерси и Guice DI, и я хочу использовать интерфейсы Mapstruct с @Inject
аннотаций. Так есть ли способ заставить Guice автоматически подключить реализации интерфейса Mapstruct?
3 ответа
Вы можете сконфигурировать реализации Mappers для аннотирования с помощью аннотации JSR 330 с помощью @Mapper(componentModel = "jsr330")
, Вы можете найти больше информации в reference documentation
,
Затем вы можете связать интерфейс Mapper с классом реализации в ваших модулях.
Один из способов связать их - использовать привязки Guice:
bind(MyDtoMapper.class).to(MyDtoMapperImpl.class)
Другой способ связать их - использовать привязки экземпляра:
bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
Thx Filip. Так что да @Mapper(componentModel = "jsr330")
почти сделал всю работу, единственное, что мне нужно было создать привязку для каждого картографа, который я использую непосредственно в моем коде bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
и INSTANCE объявлен в интерфейсе MyDtoMapper следующим образом: MyDtoMapper INSTANCE = Mappers.getMapper( MyDtoMapper.class );
Возникли проблемы с использованием Guice и jsr330 componentModel, хотя я не помню, какими они были. Мой вариант использования был немного более сложным, потому что мне нужно было также передать другой сервис декоратору mapper. Должно работать и для вашего простого случая. Закончилось выполнение методов провайдера в модуле Guice, например:
public YourModule extends AbstractModule {
//With Decorator
@Provides
@Singleton
FooMapper providesFooMapper(RequiredService requiredSvc) {
FooMapper mapper = Mappers.getMapper(FooMapper.class);
((FooMapperDecorator) mapper).setRequiredService(requiredSvc);
return mapper;
}
//Simple Mapper with no dependencies
@Provides
@Singleton
BarMapper providesBarMapper() {
return Mappers.getMapper(BarMapper.class);
}
}
Работает без проблем, хотя я бы хотел, чтобы в какой-то момент MapStruct аккуратно обрабатывал простой случай. Я также отмечу, что я использую только конструктор инъекций; должно работать то же самое для инъекции сеттера, но YMMV.