我如何结合 Guice 和 Mapstruct?

How can i combine Guice and Mapstruct?

我正在使用 jersey 和 Guice DI,我想使用 Mapstruct 接口 带有 @Inject 注释。 那么有什么方法可以强制 Guice 自动装配 Mapstruct 接口实现吗?

您可以使用 @Mapper(componentModel = "jsr330") 配置映射器的实现以使用 JSR 330 注释进行注释。您可以在 reference documentation.

中找到更多信息

然后您可以将 Mapper 接口与模块中的实现 class 绑定。

绑定它们的一种方法是使用 Guice Linked Bindings:

bind(MyDtoMapper.class).to(MyDtoMapperImpl.class)

另一种绑定它们的方法是使用Instance Bindings:

bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)

运行 关于使用 Guice 和 jsr330 componentModel 的问题,尽管我不记得它们到底是什么。我的用例有点复杂,因为我还需要将另一个服务传递给映射器装饰器。也应该适用于您的简单案例。最终在 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 在某些时候能够干净利落地处理简单的案例。我还会注意到我只使用构造函数注入;对于 setter 注入应该工作相同但 YMMV.

谢谢@Filip。所以是的 @Mapper(componentModel = "jsr330") 几乎让所有的工作都成为我必须为我在代码中直接使用的每个映射器创建绑定 bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE) 并且 INSTANCE 在 MyDtoMapper 接口中这样声明:MyDtoMapper INSTANCE = Mappers.getMapper( MyDtoMapper.class );