Java 如何组合Guice和Mapstruct?
我正在使用jersey和Guice DI,我想使用Mapstruct接口 使用Java 如何组合Guice和Mapstruct?,java,autowired,jersey-1.0,mapstruct,guice-3,Java,Autowired,Jersey 1.0,Mapstruct,Guice 3,我正在使用jersey和Guice DI,我想使用Mapstruct接口 使用@Inject注释。 那么,有没有办法强制GUI自动连接Mapstruct接口实现?您可以使用@Mapper(componentModel=“jsr330”)将映射器的实现配置为使用JSR 330注释。您可以在中找到更多信息 然后可以将映射器接口与模块中的实现类绑定 绑定它们的一种方法是使用Guice: 绑定它们的另一种方法是使用: 在使用Guice和jsr330组件模型时遇到了问题,尽管我不记得它们到底是什么。我的用
@Inject
注释。
那么,有没有办法强制GUI自动连接Mapstruct接口实现?您可以使用
@Mapper(componentModel=“jsr330”)
将映射器的实现配置为使用JSR 330注释。您可以在中找到更多信息
然后可以将映射器接口与模块中的实现类绑定
绑定它们的一种方法是使用Guice:
绑定它们的另一种方法是使用:
在使用Guice和jsr330组件模型时遇到了问题,尽管我不记得它们到底是什么。我的用例有点复杂,因为我还需要将另一个服务传递给映射器装饰器。也适用于您的简单案例。最终在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。Thx。所以,是的
@Mapper(componentModel=“jsr330”)
几乎让所有的工作都完成了,我必须为我的代码绑定(MyDtoMapper.class)中直接使用的每个映射器创建绑定。toInstance(MyDtoMapper.INSTANCE)
并且实例在MyDtoMapper接口中声明为:MyDtoMapper INSTANCE=Mappers.getMapper(MyDtoMapper.class);
感谢@filip的快速响应!componentModel=“jsr330”
非常方便。它将@javax.inject.Named
和@javax.inject.Singleton
添加到映射器实现中,但当我试图使用setter(如@inject.inject)注入映射器时(@Named BeanMapper BeanMapper){this.BeanMapper=BeanMapper;}
它试图找到用@com.google.inject.name.Named(value=)注释的BeanMapper的实现,但失败了=(你知道如何解决这个问题吗?我对guice没有太多的经验,也许我们需要为guice的设置添加一个示例。你在setter中使用的是哪个@Inject
和@Named
?也许guice不能处理混合注释,也许它们也需要来自javax.Inject
。你好,可以吗ase检查我尝试过,但无法正确注入我用您的示例和Guice的链接绑定更新了我的答案。我更愿意使用它,因为MapStruct中的映射器被认为与默认实现一起使用。MapStruct中支持构造函数和/或字段注入已经存在一个悬而未决的问题。请遵循如果要跟踪状态,请发出。
bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)
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);
}
}