簡體   English   中英

如何結合Guice和Mapstruct?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM