在过去的两天里,我一直在盯着我的代码中的一个讨厌的错误,围绕着我的 Guice 模块和我在其中声明的绑定。我的模块中声明了大约 20 个绑定,其中只有 1 个不工作。
我已经用尽module.print()
了这里的所有选项,并且想知道Guice 库中是否有类似- 的方法,我可以在其中打印出所有模块绑定的 String 版本;无论是这样还是以某种方式让 Guice 记录它在读取我有缺陷的绑定时所做的事情。
在过去的两天里,我一直在盯着我的代码中的一个讨厌的错误,围绕着我的 Guice 模块和我在其中声明的绑定。我的模块中声明了大约 20 个绑定,其中只有 1 个不工作。
我已经用尽module.print()
了这里的所有选项,并且想知道Guice 库中是否有类似- 的方法,我可以在其中打印出所有模块绑定的 String 版本;无论是这样还是以某种方式让 Guice 记录它在读取我有缺陷的绑定时所做的事情。
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());
}
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()
在这种情况下可能有用的方法。
注意:我承认我以前没有尝试过做这个确切的事情,所以让我知道它是否有效。
与上面的答案 IAmYourFaja 相同,但风格更现代:
import static java.util.stream.Collectors.joining;
String stringBinder = injector.getAllBindings().entrySet().stream()
.map(e -> e.getKey() + ": " + e.getValue())
.collect(joining("\n"));