Play Framework 2.5,到 Web 套接字的路由无法编译

Posted

技术标签:

【中文标题】Play Framework 2.5,到 Web 套接字的路由无法编译【英文标题】:Play Framework 2.5, routes to the web socket fails to compile 【发布时间】: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 ...

感谢任何帮助。

【问题讨论】:

【参考方案1】:

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

也就是说,

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

而不是

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

【讨论】:

我已经离开 Websockets 来解决这个问题。会尝试你的建议并回来。谢谢。

以上是关于Play Framework 2.5,到 Web 套接字的路由无法编译的主要内容,如果未能解决你的问题,请参考以下文章

Play framework 1.2.5 应用启动慢

Play framework 2.5新建工程执行日志

Play Framework 2.5 JavaAsync 抛出 CompletionException

java 如何使用Play Framework 2.5测试具有多部分数据的路径

Play Framework 2.5 sbt-fork-run-plugin;2.5.1: not found

从 Play Framework 更改 WS API! 2.4 至 2.5