【问题标题】:GWTP bind enum in GINGIN 中的 GWTP 绑定枚举
【发布时间】:2013-06-19 07:06:55
【问题描述】:

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

ClientGinjector.java

MyEnum getMyEnum();

ClientModule.java

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

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

[ERROR] 注入 bla.blup.MyEnum 时出错:无法创建或继承 绑定:为常量键“bla.blup.MyEnum”请求绑定,但没有 发现显式绑定

谁能帮帮我?

【问题讨论】:

    标签: java gwt compiler-errors gwt-platform gwt-gin


    【解决方案1】:

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

    That's what GIN is telling you.

    该文件是 GIN 无法接受的请求绑定的位置(即声明依赖项的位置)。

    【讨论】:

    • 谢谢,但我已经阅读了这个 google 组条目。我只是不明白我做错了什么。因为我绑定了这个枚举。请参阅我的起始帖子。
    • 那个枚举的位置呢?
    • 枚举位于第二个项目包中。但是这个包是继承在Project.gwt.xml中的。我使用该包中的其他类没有任何问题。
    【解决方案2】:

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

    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,doesn't have 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。

    【讨论】:

    • 感谢您的解释。我的用例将与您的第二个替代方案相匹配,无需注释。但我在“bind(...)”上没有方法“toInstance”。也许这是因为我的“ClientModule”是“AbstractPresenterModule”(GWTP)的扩展。
    • 哎呀!我的错,toInstance 不在 GIN 中,仅在 Guice 中。在 GIN 中,您必须使用 Provider@Provides 方法。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多