Я переношу приложение 2.3.x для Play 2.5.x, и у меня возникают проблемы с использованием инъекции зависимостей.Как правильно использовать DI для ввода конструктора контроллера Play?
В 2.3 У меня была черта HasRemoteActor
, с которой контроллер смешивался, чтобы иметь ссылку на какой-то удаленный актер на основе конфигурации. Поскольку для этого требуется объект конфигурации приложения, теперь требуется, чтобы это стало классом, поэтому конфигурация может быть введена. Вот моя попытка:
/*
Dummy controller that has environment and configuration manually injected.
*/
class ConfigurationController(env: play.api.Environment,
conf: play.api.Configuration) extends Controller {
}
/*
Dummy controller that has environment and configuration manually injected, but
sets up a remote client.
*/
class RemoteActorController(env: play.api.Environment, conf: play.api.Configuration)
extends ConfigurationController(env, conf) {
protected val remoteActorName = "foo"
private val remoteActorConf = conf.underlying.getConfig(remoteActorName)
private val system = ActorSystem("HttpServerSystem", ConfigFactory.load())
private val tcpInfo = remoteActorConf.getConfig("akka.remote.netty.tcp")
private val hostname = tcpInfo.getString("hostname")
private val port = tcpInfo.getString("port")
val path = s"akka.tcp://[email protected]$hostname:$port/system/receptionist"
private val initialContacts = Set(ActorPath.fromString(path))
protected val client = system.actorOf(
ClusterClient.props(ClusterClientSettings(system).withInitialContacts(
initialContacts)),
"ClusterClient"
)
}
/*
Actual controller whose actions correspond to endpoints in `conf/routes`.
*/
@Singleton
class BarController @Inject()(env: play.api.Environment,
conf: play.api.Configuration) extends
RemoteActorController(env, conf) {
// ...
}
Однако, когда я начинаю мое заявление, я считаю, что система актер всегда удается найти в его порт (даже если ничего не слушает этот порт), независимо от номера порта.
play.api.UnexpectedException: Unexpected exception[ProvisionException: Unable to provision, see the following errors:
1) Error injecting constructor, org.jboss.netty.channel.ChannelException: Failed to bind to: /127.0.0.1:8888
Там, кажется, проблема с синхронизацией впрыска, но я так ново для DI, что у меня возникают проблемы отладки его.
Я попытался добавить routesGenerator := InjectedRoutesGenerator
в мой build.sbt
и префиксами связанных контроллеров связанных с ними контроллеров с помощью @
, но все равно найду те же исключения во время выполнения.
У кого-нибудь есть предложения?
«Не удалось связать» часто означает, что у вас уже есть приложение, использующее этот порт, попробуйте изменить конфигурацию для использования другого порта. – vdebergue
@vdebergue Порты не используются ни TCP, ни UDP. – erip