【问题标题】:Play Framework 2.5, routes to the web socket fails to compilePlay Framework 2.5,到 Web 套接字的路由无法编译
【发布时间】:2016-04-13 04:09:56
【问题描述】:

我正在尝试将我的 WebSocket 控制器代码迁移到 Play 2.5,并按照ScalaWebSockets 的说明进行操作。我的路由配置出现编译器错误。 我的 WebSocket 控制器代码如下

package controllers

import akka.actor.ActorSystem
import akka.stream.Materializer
import com.google.inject.Inject
import utils.silhouette.{AuthenticationController, AuthenticationEnvironment}
// This is needed to implicitly provide the Scala ActorSystem
import play.api.libs.concurrent.Execution.Implicits._
import play.api.mvc._
import play.api.libs.streams._
import scala.concurrent.Future

abstract class IntegrationMonitorProvider @Inject() (implicit system:     ActorSystem,
                                                 materializer: Materializer)
  extends AuthenticationController{

  def monitor = WebSocket.acceptOrResult[String, String] { request =>
    implicit val req = Request(request, AnyContentAsEmpty)
    SecuredRequestHandler { securedRequest =>
      Future.successful(HandlerResult(Ok, Some(securedRequest.identity)))
    }.map {
      case HandlerResult(r, Some(user)) =>
                Right(ActorFlow.actorRef(IntegrationMonitor.props(req.session.get("integration").get.toLong) _))
      case HandlerResult(r, None) => Left(r)
    }
  }
}

打算支持 WebSocket 的各个控制器应该对此进行扩展。这种模式在 Play 2.4 中运行良好,并且这个控制器代码也在编译。 但是我的路由器配置无法编译并出现以下错误

routes:56: 方法 apply 的参数不足:(request: play.api.mvc.RequestHeader)scala.concurrent.Future[Either[play.api.mvc.Result,akka.stream.scaladsl.Flow[play .api.http.websocket.Message, play.api.http.websocket.Message, _]]] 在 trait WebSocket 中。 未指定值参数请求。

Read from stdout: 
GET     /sample/monitor        controllers.sample.Connection.monitor()

扩展 IntegrationMonitorProvider 的控制器如下

package controllers.sample
import javax.inject.Inject
import akka.actor.ActorSystem
import akka.stream.Materializer
import controllers.{IntegrationMonitor, IntegrationMonitorProvider}
import modules.oauth.{Credential, Metadata, TokenReader}
import play.Logger
import play.api.i18n.MessagesApi
import play.api.libs.json.JsResult
import play.api.mvc.{AnyContent, BodyParsers}
import utils.silhouette.{AuthenticationController, AuthenticationEnvironment}
// This is needed to implicitly provide the Scala ActorSystem
import play.api.libs.concurrent.Execution.Implicits._
import scala.concurrent.Future

class Connection @Inject()(val env: AuthenticationEnvironment, val messagesApi: MessagesApi)
                      (implicit system: ActorSystem,
                       materializer: Materializer)
extends IntegrationMonitorProvider with UrlCreator with DataReader {...

感谢任何帮助。

【问题讨论】:

    标签: playframework websocket routes akka-stream playframework-2.5


    【解决方案1】:

    我可以通过删除routes中的括号来解决问题

    也就是说,

    GET     /sample/monitor        controllers.sample.Connection.monitor
    

    而不是

    GET     /sample/monitor        controllers.sample.Connection.monitor()
    

    【讨论】:

    • 我已经离开 Websockets 来解决这个问题。会尝试你的建议并回来。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多