【问题标题】:Guice ThrowingProvider problemGuice ThrowingProvider 问题
【发布时间】:2011-06-07 20:33:17
【问题描述】:

根据Guice的ThrowingProvider文档,我有以下界面:

public interface IConfigurableProvider<T> extends ThrowingProvider<T, ConfigException> {}

我有多个实现这个接口的类,假设我有以下:

public class SomethingProvider extends ConfiguredProvider implements IConfigurableProvider<Something> {}

当然这个类实现了必要的方法:

public Something get() throws ConfigException { /* ... */ }

在我的模块中,MyModule.java 中有以下代码

ThrowingProviderBinder.create(binder())
    .bind(IConfigurableProvider.class, Something.class)
    .to(SomethingProvider.class);

但是当我启动我的应用程序时,会产生以下错误:

6) No implementation for com.package.Something was bound.
  while locating com.package.Something
    for parameter 5 at com.package.OtherClass.<init>(OtherClass.java:78)
  at com.package.MyModule.configure(MyModule.java:106)

我真的不知道应该从哪里开始寻找错误。

更新:即使我也设置了范围,它也会提供相同的错误:

ThrowingProviderBinder.create(binder())
    .bind(IConfigurableProvider.class, Something.class)
    .to(SomethingProvider.class)
    .in(Singleton.class);

【问题讨论】:

  • 正如公认的答案指出的那样,我误解了ThrowingProviderBinder 的用法。注入的构造函数应该等待提供者而不是提供的对象(并且应该处理已检查的异常)。

标签: java dependency-injection guice provider


【解决方案1】:

您需要注入IConfigurableProvider&lt;Something&gt;,而不是注入Something:

public class OtherClass {
  @Inject
  public OtherClass(IConfigurableProvider<Something> somethingProvider) {
    ...
  }
}

这是因为只有在 OtherClass 的代码(或任何使用 Something 实例的代码)中,您才能处理 Provider 抛出的异常,例如您的情况下的 ConfigException。

【讨论】:

  • 但我不想修改构造函数。有什么方法可以实现我真正想要的吗?
  • 我想我会忘记ThrowingProvider 并简单地使用Provider 接口并将源异常包装到ProvisionException
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2011-09-15
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多