由于缺少java.util.Optional的实现而导致Guice CreationException

时间:2016-10-07 15:24:24

标签: java guice

我将为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

我可能会遗漏哪些会导致此错误?

1 个答案:

答案 0 :(得分:2)

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

支持Java 8's Optional<T>,与其他Java 8支持一样,在Guice 4.0 (Apr 2015)中出现,并且仅在使用Multibindings OptionalBinder时才支持。如果没有它,或者在以前版本的Guice中,当用作密钥时,您的Injector将像任何其他泛型类型一样对待Optional。

Guice 3.0&#34;可选&#34;绑定仅限于使用@Inject(optional=true)的方法和字段注入,这仍然有效,但Guice 4.0升级中的任何内容都不会自动支持Multibindings案例之外的可选类型。