2017-04-12 80 views

回答

1

您可以使用@Mapper(componentModel = "jsr330")配置要用JSR 330注释注释的映射器的实现。您可以在reference documentation中找到更多信息。

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

一来约束他们的方法是使用吉斯Linked Bindings

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

约束他们的另一种方法是使用Instance Bindings

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

感谢@filip快速响应! 'componentModel =“jsr330”'真的很方便的事情。它将'@ javax.inject.Named'和'@ javax.inject.Singleton'添加到映射器实现中,但是当我尝试使用setter注入它时,就像这样@Inject void setBeanMapper(@Named BeanMapper beanMapper){ this .beanMapper = beanMapper; }' 它试图找到用'@ com.google.inject.name.Named(value =)'注解的BeanMapper的实现,它失败=( 你有任何想法如何解决这个问题? –

+0

我没有很多guice的经验,也许我们需要为guice添加一个设置的例子,你在setter中使用了哪个'@Inject'和'@ Named'?也许guice不能用于混合注释,也许他们需要来自javax.inject' – Filip

0

跑进问题与使用吉斯和jsr330 componentModel,尽管我不记得他们究竟是什么。我的用例有点复杂,因为我需要将另一个服务传递给映射器装饰器。应该适合你的简单情况。在吉斯模块落得这样做供应商的方法,就像这样:

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。

+0

在MapStruct中支持构造函数和/或字段注入已经有一个公开的问题,如果你有问题,请按照[https://github.com/mapstruct/mapstruct/issues/571]的问题。想跟踪状态 – Filip

0

Thx @Filip。所以是@Mapper(componentModel = "jsr330")几乎使所有工作只有我必须创建绑定每个映射器,我直接在我的代码bind(MyDtoMapper.class).toInstance(MyDtoMapper.INSTANCE)和INSTANCE声明在MyDtoMapper接口这种方式:MyDtoMapper INSTANCE = Mappers.getMapper(MyDtoMapper.class);

+0

我用你的例子和Guice的链接绑定更新我的答案我宁愿使用它,因为来自MapStruct的Mappers被认为与默认实现一起使用 – Filip