1

我试图能够在我的代码中有这个

@Inject
private Map<String, Provider<Processor>> providers;

我正在尝试,但这段代码无法编译

MapBinder<String, Provider<Processor>> mapbinder = MapBinder.newMapBinder(binder, String.class, Provider<Processor>.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);

此代码在启动时失败,因为它无法绑定我的地图

MapBinder<String,Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class);
mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);

如何在此处正确设置绑定?

注意:我也在寻找简单的东西,所以每次我们有一个新处理器时开发人员只需添加一行。(我希望我不必添加一行+一些工厂接口......应该是一种方式,但我除了上面的 TypeLiteral 和 toProvider() 方法之外,还尝试了其他方法)。

更多信息:好的,我发现我是否有以下行(但根本不调用 addBinding)Guice 实际上会启动,这很好,但是所有 addBinding().to 方法签名现在都是错误的,因为他们想要一个

Provider<? extends Provider<Processor>>
//This below line ends up with mabbinder2.addBinder().to() wanting the above param type?
MapBinder<String, Provider<Processor>> mapbinder2 = MapBinder.newMapBinder(binder, stringLit, list);

从根本上改变我的想法,我尝试注入这样的东西(希望 map.get("xxx") 每次都会创建新实例......

@Inject
private Map<String, Processor> providers;

我像这样绑定它,但不幸的是,地图总是返回相同的实例:(...

MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class);
mapbinder.addBinding("splineV1Beta").toProvider(new TypeLiteral<Provider<SplineProcessor>>() {;});
mapbinder.addBinding("invertV1Beta").toProvider(new TypeLiteral<Provider<InvertProcessor>>() {;});

编辑:根据这个文档http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/MapBinder.html你可以有一个

 MapBinder<String, Snack> and inject a Map<String, Provider<Snack>>

但是当我这样做(使用私有字段)时,我得到以下内容......(而当我更改为我的其他解决方案但不调用 mapbinder.addBinding 时,它绑定并工作得很好)......

1) No implementation for java.util.Map<java.lang.String,    
javax.inject.Provider<controllers.modules2.framework.Processor>> was bound.

我是否必须使用构造函数注入才能像他们的示例一样工作?我在一个抽象类中,因此更改 10 个类会非常不方便:(。

谢谢,院长

4

2 回答 2

2

尽管 Guice 似乎非常擅长交替使用 JSR-330 注释,但 Multibindings 似乎将Provider类型隐藏在 a 中Map,因此可能希望注入 a java.util.Map<java.lang.String, com.google.inject.Provider<...>>。我无法重现您的问题,但请尝试一下,看看它是否有帮助。

旁注:如果您想避免在任何地方的代码中更改它,您可以将提供者绑定Map<String, javax.inject.Provider<Foo>>到接受 multibinder-created 的东西Map<String, com.google.inject.Provider<Foo>>。如果我是对的并且这就是问题所在,那么您可以在一个地方修复它,而不是在各处之间javax.inject弹跳com.google.inject

于 2013-02-12T16:56:25.147 回答
0

如果你想Map<String, Provider<Processor>>在注入点,绑定它的方法是:

MapBinder<String, Processor> mapbinder = MapBinder.newMapBinder(binder, String.class, Processor.class); mapbinder.addBinding("splineV1Beta").to(SplineProcessor.class); mapbinder.addBinding("invertV1Beta").to(InvertProcessor.class);

如果您提供自定义提供程序,您将使用toProvider(),但您不是,即您只是尝试使用隐式底层提供程序。

于 2015-08-28T22:32:20.240 回答