【发布时间】:2010-12-27 16:45:16
【问题描述】:
我正在尝试使 DI 与 Guice 一起工作,完全按照 the manual 中的内容进行操作(在我看来)。
我无法解释这个问题,因为我并不真正理解它 - 一切似乎都很合乎逻辑并且应该可以工作......但它没有。所以,我只能附上代码和堆栈跟踪:
public class Runner {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TestModule());
//next line throws the exception
JMeterComponent jMeterComponent =
injector.getInstance(JMeterComponent.class);
....
}
}
如您所见,我正在尝试实例化 JMeterComponent 类的对象。它的构造函数(稍后会看到)接受 3 个参数:所有这些参数也应该由 IoC 实例化并注入。
这里是TestModule,配置了这三个参数:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(Callable.class).annotatedWith(Names.named("JMeter"))
.to(JMeterTask.class);
bind(Processor.class).annotatedWith(Names.named("JMeter"))
.to(JMeterResultsProcessor.class);
bind(Renderer.class).annotatedWith(Names.named("JMeter"))
.to(JMeterResultsWikiRenderer.class);
}
}
现在,让我们看看这些具体的实现 - JMeterTask、JMeterResultsProcessor 和 JMeterResultsWikiRenderer(为了简单起见,它们都有假体):
public class JMeterTask implements Callable<JMeterRawResults> {
public JMeterRawResults call() throws Exception {
return new JMeterRawResults();
}
}
public class JMeterResultsProcessor implements
Processor<JMeterRawResults, JMeterResults> {
public JMeterResults process(JMeterRawResults raw) {
return new JMeterResults();
}
}
public class JMeterResultsWikiRenderer implements Renderer<JMeterResults> {
public Map<String, String> render(JMeterResults jMeterResults) {
Map<String, String> results = Maps.newHashMap();
...
return results;
}
}
现在让我们看看JMeterComponent 类,哪个实例的构造是这里整个 DI 相关内容的目标:
public class JMeterComponent extends AbstractComponent<String, String> {
@Inject
public JMeterComponent(@Named("JMeter") Callable<String> task,
@Named("JMeter")Processor<String, String> processor,
@Named("JMeter")Renderer<String> renderer) {
super(task, processor, renderer);
}
}
这是堆栈跟踪:
Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for stat.domain.Processor<java.lang.String, java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter) was bound.
while locating stat.domain.Processor<java.lang.String, java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter)
for parameter 1 at stat.components.jmeter.JMeterComponent.<init>(JMeterComponent.java:18)
while locating cstat.components.jmeter.JMeterComponent
2) No implementation for stat.domain.Renderer<java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter) was bound.
while locating stat.domain.Renderer<java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter)
for parameter 2 at stat.components.jmeter.JMeterComponent.<init>(JMeterComponent.java:18)
while locating stat.components.jmeter.JMeterComponent
3) No implementation for java.util.concurrent.Callable<java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter) was bound.
while locating java.util.concurrent.Callable<java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter)
for parameter 0 at stat.components.jmeter.JMeterComponent.<init>(JMeterComponent.java:18)
while locating stat.components.jmeter.JMeterComponent
一些额外的事实:
- 我用的是 guice-2.0(和
featured标签) - 代码中的任何其他类中不再有来自
com.google.inject包的任何注释 - 接口
Processor和Renderer放在一个模块中,它们的jmeter-实现(JMeterResultsProcessor和其他)和JMeterComponent类放在另一个模块中。
这几乎就是所有要说的。
很抱歉这么长的帖子,感谢您耐心阅读到最后。
关于为什么会出现错误以及如何修复它的任何想法?
【问题讨论】:
标签: java dependency-injection guice