Java 如何组合Guice和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组件模型时遇到了问题,尽管我不记得它们到底是什么。我的用

我正在使用jersey和Guice DI,我想使用Mapstruct接口 使用
@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);
    }
}