【问题标题】:Guice CreationException - No implementation for type Foo was boundGuice CreationException - 没有绑定 Foo 类型的实现
【发布时间】:2011-08-13 05:43:57
【问题描述】:

需要一些帮助来理解这个错误以及解决它的可能方法。

所以我有一个这样的类型:

class Foo {
   static final class Bar {}

   @Inject
   Foo(TypeA a, @Nullable Set<Bar> b) {}
}

为了使 Foo 可注入,我需要为 参数 a 和 b,现在我提供 Type a 没有问题 实现,它不为空,所以我有一个@Provides 方法 包模块类。但是b呢?它是可空的,如何写 @提供了一个可以为空的参数?我的猜测是 不应该是必需的,Guice 应该理解注释...... 但是有些事情不正常,我收到了这个错误:

1) 没有绑定 java.util.Set&lt;Foo$Bar&gt; 的实现。

这里是 @Provides 方法(在 atm 不起作用)

@Provides @Nullable
public Foo provideFoo(TypeA a, @Nullable Set<Foo.Bar> b) {
    return new Foo(a, b);
}

我知道嵌套类既不是公共的也不是构造函数,所以也许 guice 无法访问它,但即使我将它们全部公开(我 真的不想要)错误仍然存​​在......我有什么东西吗 失踪?

【问题讨论】:

  • 你真的需要空集合吗?你能用空集吗?
  • 不是真的,但最初的想法也是不要求客户端提供一个Set对象(即使客户端并不关心也构造一个空的Set),Foo构造函数检查null并创建如果需要,一个空集。我知道我可以通过添加 Foo(TypeA a) 并删除 @Nullable 来重载构造函数。也许我应该考虑一下。

标签: java dependency-injection guice


【解决方案1】:

没有Set&lt;Bar&gt; 的任何绑定和拥有Set&lt;Bar&gt; 的绑定null 之间是有区别的。

您需要一个返回Set&lt;Bar&gt;(可能是null)或类似bind(Bar.class).toProvider(Providers.ofInstance(null))@Provides 方法,以便能够向Foo 的构造函数提供第二个参数。

另请注意,您的Foo@Provides 方法只是直接调用@Inject 带注释的构造函数,因此根本没有必要。我还要说最好绑定到空的Set&lt;Bar&gt; 而不是null

【讨论】:

  • 所以根据您的建议,我是否应该将这段代码重构为类似的内容(Stas Kurilin 的早期回复似乎暗示了这一点)。两个构造函数,Foo(TypeA a) 和 Foo(TypeA a, Set b),然后@Inject 第一个?
猜你喜欢
  • 1970-01-01
  • 2022-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
相关资源
最近更新 更多