[英]How can i combine Guice and Mapstruct?
我正在使用球衣和Guice DI,並且我想使用帶有@Inject
批注的Mapstruct接口。 那么,有什么方法可以迫使Guice自動裝配Mapstruct接口實現?
您可以使用@Mapper(componentModel = "jsr330")
來配置要使用JSR 330注釋進行注釋的@Mapper(componentModel = "jsr330")
。 您可以在reference documentation
找到更多信息。
然后,您可以將Mapper接口與模塊中的實現類綁定。
綁定它們的一種方法是使用Guice 鏈接綁定 :
bind(MyDtoMapper.class).to(MyDtoMapperImpl.class)
綁定它們的另一種方法是使用實例綁定 :
bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
盡管我不記得它們的確切含義,但遇到了使用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。
謝謝@Filip 。 因此,是的, @Mapper(componentModel = "jsr330")
幾乎使所有工作僅是我必須為直接在代碼bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
使用的每個映射器創建綁定的事情,並且在其中聲明了INSTANCE MyDtoMapper接口是這樣的: MyDtoMapper INSTANCE = Mappers.getMapper( MyDtoMapper.class );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.