Внедрение текущего приложения в Play 2.5.2

Я использую DI для доступа к моему приложению в Play 2.5:

import com.google.inject.{Inject, Provider}
import play.api.mvc._
import play.api.Application

class ApplicationController @Inject()(p: Provider[Application]) extends Controller {
  implicit lazy val app = p.get()
  println(app.hashCode()+"") // Random line to use the injected app
}

Я получаю следующую ошибку:

ProvisionException: Unable to provision, see the following errors:

1) Tried proxying play.api.Application to support a circular dependency, but circular proxies are disabled. ...

Я обратился к руководству по миграции в Play: https://www.playframework.com/documentation/2.5.x/Migration25#Handling-legacy-components

и сделал, как говорится, чтобы избежать циклической зависимости, однако у меня все еще есть эта ошибка.

Я также нашел переменную с именем disableCircularProxies, которую я в настоящее время не использую (http://google.github.io/guice/api-docs/latest/api-diffs/changes/docdiffs_com.google.inject.html), поскольку я не уверен как это сделать и нашел очень мало информации об этом.

Любая идея, как решить эту ошибку циклической зависимости?

Вот полная трассировка стека:

   Tried proxying play.api.Application to support a circular dependency, but circular proxies are disabled.
  at play.api.DefaultApplication.class(Application.scala:221)
  while locating play.api.DefaultApplication
  while locating play.api.Application
  at myCustomProject.controllers.ApplicationController.<init>(ApplicationController.scala:9)
  while locating myCustomProject.controllers.ApplicationController
    for parameter 1 at router.Routes.<init>(Routes.scala:31)
  while locating router.Routes
  while locating play.api.inject.RoutesProvider
  while locating play.api.routing.Router
    for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200)
  while locating play.api.http.JavaCompatibleHttpRequestHandler
  while locating play.api.http.HttpRequestHandler
    for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221)
  at play.api.DefaultApplication.class(Application.scala:221)
  while locating play.api.DefaultApplication
  while locating play.api.Application

В конечном счете, я не должен использовать этот Provider[Application], а скорее конфигурацию, среду,... из приложения. Просто, согласно документу, у меня должно получиться так.


person Scipion    schedule 28.04.2016    source источник
comment
Вы должны иметь возможность внедрить приложение напрямую, не нужно вводить провайдера, т.е. @Inject()(val application: Application) должно работать нормально.   -  person alextsc    schedule 28.04.2016
comment
К сожалению, это дает мне ту же ошибку. Согласно документу: обратите внимание, что в этом случае вы обычно хотите использовать Provider[Application], чтобы избежать циклических зависимостей.   -  person Scipion    schedule 28.04.2016
comment
Это обычный контроллер? В сообщении об ошибке указано, откуда требуется другая зависимость?   -  person rethab    schedule 28.04.2016
comment
Это обычный контроллер, самый классический, какой только можно найти. Я добавил полную трассировку стека (хотя это мало что говорит)   -  person Scipion    schedule 28.04.2016
comment
Какую версию Play вы используете? Я использую версию 2.5.3, и ваш код у меня работает.   -  person cbley    schedule 28.04.2016
comment
Я был на 2.5.2, вроде решил проблему с переходом на 2.5.3   -  person Scipion    schedule 28.04.2016


Ответы (1)


Java-версия:

@Inject
private Provider<Application> application;

private void someMethod {
   ...
   application.get();
}
person BatteryAcid    schedule 17.08.2016