Я использую 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], а скорее конфигурацию, среду,... из приложения. Просто, согласно документу, у меня должно получиться так.
@Inject()(val application: Application)
должно работать нормально. - person alextsc   schedule 28.04.2016