我正在尝试使用以下代码行将枚举放入 ginjector:
ClientGinjector.java
MyEnum getMyEnum();
客户端模块.java
bind(MyEnum.class).in(Singleton.class);
但是当我尝试编译时,出现以下错误:
[错误] 注入 bla.blup.MyEnum 时出错:无法创建或继承绑定:为常量键“bla.blup.MyEnum”请求绑定,但未找到显式绑定
谁能帮帮我吗?
我正在尝试使用以下代码行将枚举放入 ginjector:
ClientGinjector.java
MyEnum getMyEnum();
客户端模块.java
bind(MyEnum.class).in(Singleton.class);
但是当我尝试编译时,出现以下错误:
[错误] 注入 bla.blup.MyEnum 时出错:无法创建或继承绑定:为常量键“bla.blup.MyEnum”请求绑定,但未找到显式绑定
谁能帮帮我吗?
必须在 GinModule 中显式绑定常量(原始类型、字符串、类或枚举)(使用 bindConstant() 或 bind())(因为 GIN 不会注入合理的默认值)。
该文件是请求绑定的地方(即声明依赖项的地方),而 GIN 不能接受。
无法构造枚举类,它唯一的有效实例是它的枚举值。这意味着您必须绑定一个特定的枚举值,该值将被注入到该枚举类型的任何字段或参数中。
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。