«Пожалуйста, подождите, пока инъекция не завершится, чтобы использовать этот объект» ошибка от Guice - PullRequest
2 голосов
/ 07 октября 2010

У нас есть два одноэлементных объекта (объявленных через in(Scopes.SINGLETON)) в Guice, каждый из которых использует другой в своем конструкторе. Guice способ реализовать это с помощью прокси - он сначала инициализирует объект с прокси для другого объекта, и только когда этот объект необходим, он разрешается.

При запуске этого кода из нескольких потоков мы получаем следующее исключение:

java.lang.IllegalStateException: This is a proxy used to support
circular references involving constructors. The object we're proxying is not
constructed yet. Please wait until after injection has completed to use this
object.
    at
com.google.inject.internal.ConstructionContext$DelegatingInvocationHandler.invoke(ConstructionContext.java:100)

Я предполагаю, что это ошибка в Guice, потому что мы не делаем ничего необычного. Одним из найденных нами обходных путей является ранняя инициализация синглетонов с использованием .asEagerSingleton(), но это не очень удобно, например, для тестирования.

Является ли это известной проблемой? Сообщается о проблеме с Google Guice , воспроизводимой с помощью автономного теста.

Любые другие предложения / обходные пути?

1 Ответ

4 голосов
/ 07 октября 2010

Вы пытались вставить Provider<T> в каждый конструктор вместо реальных экземпляров?

Если вам не нужен другой экземпляр в коде конструктора, просто сохраните Provider впоследнее поле, и используйте это поле позже (вызывая get()).

...