Как я могу объединить 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.

Другие вопросы по тегам