1

我正在尝试使用以下代码行将枚举放入 ginjector:

ClientGinjector.java

MyEnum getMyEnum();

客户端模块.java

bind(MyEnum.class).in(Singleton.class);

但是当我尝试编译时,出现以下错误:

[错误] 注入 bla.blup.MyEnum 时出错:无法创建或继承绑定:为常量键“bla.blup.MyEnum”请求绑定,但未找到显式绑定

谁能帮帮我吗?

4

2 回答 2

1

必须在 GinModule 中显式绑定常量(原始类型、字符串、类或枚举)(使用 bindConstant() 或 bind())(因为 GIN 不会注入合理的默认值)。

这就是 GIN 告诉你的。

该文件是请求绑定的地方(即声明依赖项的地方),而 GIN 不能接受。

于 2013-06-19T07:15:46.420 回答
0

无法构造枚举类,它唯一的有效实例是它的枚举值。这意味着您必须绑定一个特定的枚举值,该值将被注入到该枚举类型的任何字段或参数中。

Guice/GIN 鼓励您对常量使用绑定注解,因此您可以根据上下文注入不同的常量值;例如

@Named("foo") @Inject MyEnum myEnum;

–

bindConstant().annotatedWith(Names.named("foo")).to(MyEnum.FOO);

如果您不想使用绑定注释(因为您知道在整个应用程序中只需要一个枚举值),则不能使用bindConstant(),但可以使用toInstance

@Inject MyEnum myEnum;

…

bind(MyEnum.class).toInstance(MyEnum.FOO);

不过,这仅适用于 Guice,不适用于 GIN,后者没有toInstance. 在 GIN 中,您必须使用Provider类或@Provides方法:

class MyEnumProvider implements Provider<MyEnum> {
  @Override
  public MyEnum get() {
    return MyEnum.FOO;
  }
}
…
bind(MyEnum.class).toProvider(MyEnumProvider.class);

或者

@Provides
MyEnum provideMyEnum() {
  return MyEnum.FOO;
}

上述两种方法也适用于 Guice。

于 2013-06-19T10:02:34.253 回答