3

在过去的两天里,我一直在盯着我的代码中的一个讨厌的错误,围绕着我的 Guice 模块和我在其中声明的绑定。我的模块中声明了大约 20 个绑定,其中只有 1 个不工作。

我已经用尽module.print()了这里的所有选项,并且想知道Guice 库中是否有类似- 的方法,我可以在其中打印出所有模块绑定的 String 版本;无论是这样还是以某种方式让 Guice 记录它在读取我有缺陷的绑定时所做的事情。

4

3 回答 3

7
Injector injector = Guice.createInjector(myModuleInstance);
Map<Key<?>,Binding<?>> map = injector.getBindings();
for(Entry<Key<?>, Binding<?>> e : map.entrySet()) {
    System.out.println(e.getKey() + ": " + e.getValue());
}
于 2012-05-22T12:07:10.987 回答
3

herpylderp 的解决方案在大多数情况下应该可以工作。如果您想在不创建 Injector 的情况下单独查看模块(例如,如果您有一个配置错误阻止您构建 Injector),您可以使用 Guice SPI 工具提取一组绑定列表模块。它还可以让你做更多的事情,但这不是重点;)

请参阅: https ://github.com/google/guice/wiki/ExtendingGuice#examples

在列出的示例中,他们检查了静态注入的情况。对于这种情况,您可以执行相同的操作,但要覆盖visit(Binding).ElementVisitor

另请参阅:http: //google.github.io/guice/api-docs/4.2.2/javadoc/index.html ?com/google/inject/spi/Elements.html

另外,请注意,每个方法Binding都有一个getSource()在这种情况下可能有用的方法。

注意:我承认我以前没有尝试过做这个确切的事情,所以让我知道它是否有效。

于 2012-05-27T14:56:26.350 回答
1

与上面的答案 IAmYourFaja 相同,但风格更现代:

import static java.util.stream.Collectors.joining;
String stringBinder = injector.getAllBindings().entrySet().stream()
            .map(e ->  e.getKey() + ": " +  e.getValue())
            .collect(joining("\n"));
于 2017-07-19T15:06:56.180 回答