Исключение Guice CreationException из-за отсутствия реализации для java.util.Необязательно

#java #guice

#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:

Тривиально, вам не хватает привязки @Config(AsyncHttpClientConfigProvider.allowPoolingConnection) Optional<Boolean> , которая отличается от @Config(AsyncHttpClientConfigProvider.allowPoolingConnection) Boolean . Для более конкретного ответа нам нужно будет увидеть больше вашей предыдущей рабочей точки внедрения и текущей неудачной точки внедрения, но учитывая, что java.util .Optional не существовало до Java 8, вероятно, вы добавили это сами и, таким образом, изменили ключ Guice, используемый для поиска привязки.

Поддержка Java 8 Optional<T> , как и остальная поддержка Java 8, появилась в Guice 4.0 (апрель 2015) и только при использовании многосвязей OptionalBinder . Без этого или в предыдущих версиях Guice ваш инжектор будет обрабатывать Optional как любой другой общий тип при использовании в качестве ключа.

«Необязательные» привязки Guice 3.0 были ограничены внедрением методов и полей с @Inject(optional=true) помощью , которая все еще работает, но ничто в обновлениях Guice 4.0 автоматически не поддерживает необязательные типы за пределами случая многозадачности.