由于缺少 java.util.Optional 的实现,Guice CreationException

Guice CreationException due to missing implementation for java.util.Optional

我正在将为 Java 7 编写的应用程序升级到版本 8。它使用 Guice 将配置值注入对象的构造函数。但是,在升级 Java 版本之后,我现在在 运行 单元测试时遇到这个神秘错误:

java.lang.RuntimeException: com.google.inject.CreationException: Guice creation errors:

1) No implementation for java.util.Optional<java.lang.Boolean> annotated with @Config(value=AsyncHttpClientConfigProvider.allowPoolingConnection) was bound.
  while locating java.util.Optional<java.lang.Boolean> annotated with @Config(value=AsyncHttpClientConfigProvider.allowPoolingConnection)
    for field at AsyncHttpClientConfigProvider.allowPoolingConnection(AsyncHttpClientConfigProvider.java:212)
  at Module.configure(Module.java:24)

...


13 errors
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
    at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:72)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at org.jukito.JukitoRunner.ensureInjector(JukitoRunner.java:105)
    at org.jukito.JukitoRunner.computeTestMethods(JukitoRunner.java:233)
    ... 19 more

我可能遗漏了什么会导致此错误?

很简单,您缺少 @Config(AsyncHttpClientConfigProvider.allowPoolingConnection) Optional<Boolean> 的绑定,这与 @Config(AsyncHttpClientConfigProvider.allowPoolingConnection) Boolean 不同。对于更具体的答案,我们需要查看更多您以前的工作注入点和当前失败的注入点,但鉴于 java.util.Optional 在 Java 8 之前不存在,您可能添加了你自己并因此更改了用于查找绑定的 Guice 密钥。

支持 Java 8's Optional<T>, like the rest of Java 8 support, came out in Guice 4.0 (Apr 2015), and only when using the Multibindings OptionalBinder。如果没有它,或者在以前版本的 Guice 中,您的 Injector 在用作 Key 时将像对待任何其他泛型类型一样对待 Optional。

Guice 3.0 的 "optional" 绑定仅限于使用 @Inject(optional=true) 的方法和字段注入,这仍然有效,但 Guice 4.0 的升级中没有任何内容自动支持 Multibindings 情况之外的可选类型.