我正在使用球衣和 Guice DI,我想使用带有@Inject
注释的 Mapstruct 接口。那么有什么方法可以强制 Guice 自动装配 Mapstruct 接口实现吗?
3 回答
您可以使用 JSR 330 注解配置 Mappers 的实现@Mapper(componentModel = "jsr330")
。您可以在 中找到更多信息reference documentation
。
然后,您可以将 Mapper 接口与模块中的实现类绑定。
绑定它们的一种方法是使用 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 在某些时候干净地处理简单的案例。我还要注意我只使用构造函数注入;除了 YMMV 之外,setter 注入应该同样有效。
谢谢@Filip 。所以是@Mapper(componentModel = "jsr330")
的,几乎所有的工作都是我必须为我直接在我的代码中使用的每个映射器创建绑定,bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
并且 INSTANCE 在 MyDtoMapper 接口中以这种方式声明:MyDtoMapper INSTANCE = Mappers.getMapper( MyDtoMapper.class );