2016-10-07 68 views
1

我將爲Java 7編寫的應用程序升級到版本8.它使用Guice將配置值注入到對象的構造函數中。Guice CreationException由於缺少java.util.Optional的實現

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 

什麼可能我會丟失,將導致此錯誤:但是,加大了Java版本後,我現在運行單元測試時得到這個神祕的錯誤?

回答

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中,當用作Key時,Injector將像任何其他泛型一樣對待Optional。

Guice 3.0的「可選」綁定僅限於使用@Inject(optional=true)的方法和域注入,但仍然有效,但Guice 4.0的升級沒有任何內容自動支持Multibindings案例之外的可選類型。