在带有 Websocket 的 Play Framework 中使用 Try/Catch 时出错
Error when using Try/Catch in Play Framework with Websocket
我在 Scala 中使用带有 Play Framework 的网络套接字。我想在我的项目中使用 Try/Catch
功能来捕获一些 Exceptions
,例如 Server Exception
、Network Exception
等
我做了什么:
WebSocketController.scala
object LoginWS {
def props(out: ActorRef) = Props(new LoginWS(out))
}
class LoginWS(out: ActorRef) extends Actor {
def receive = {
case json_req: JsObject =>
var user_name = (json_req \ "user_name").as[String]
var password = (json_req \ "password").as[String]
var source = (json_req \ "source_type").as[String]
var result = UserLogin.authenticateUser(user_name, password).isDefined
var userID: Int = 0;
if(result) {
userID = UserLogin.getUserRole(user_name, password)
val login_status : String = "Success"
out ! Json.toJson(JsObject(Seq("login_status" -> JsString(login_status), "user_id" -> JsNumber(userID))))
}
else {
val login_status : String = "Failure"
out ! Json.toJson(JsObject(Seq("login_status" -> JsString(login_status), "user_id" -> JsNumber(userID))))
}
}
}
object WebSocketController extends Controller {
def login = WebSocket.acceptWithActor[JsValue, JsValue] { request =>
out => LoginWS.props(out)
}
}
我尝试了什么:
我用过this answer posted by Ende Neu,但显示not found: value APIAction
。注意:我也在 routes 文件中添加了 APIAction
代码:
class LoginWS(out: ActorRef) extends Actor {
def receive = APIAction { request
case json_req: JsObject =>
.....
....//code here
}
}
object WebSocketController extends Controller {
def login = WebSocket.acceptWithActor[JsValue, JsValue] { request =>
out => LoginWS.props(out)
}
def APIAction(f: Request[AnyContent] => Result): Action[AnyContent] =
Action { request =>
Try(f(request))
.getOrElse(
InternalServerError(Json.obj("code" -> "500", "message" -> "Server error"))
)
}
}
请帮助我在 Web socket
中实现 Try/Catch 功能
登录请求在 actor 中处理,我认为你应该在那里处理你的错误。如果您想捕获所有异常而不是显式处理可能出错的地方,我建议执行以下操作
object SomeUtils {
def catchAll[A](out: ActorRef)(f: => A): Unit = {
val message = Try(f).getOrElse(Json.obj("code" -> "500", "message" -> "Server error"))
out ! message
}
}
import SomeUtils._
class LoginWS(out: ActorRef) extends Actor {
def receive = {
case json_req: JsObject => catchAll(out) {
val userName = (json_req \ "user_name").as[String]
val password = (json_req \ "password").as[String]
val authenticated = UserLogin.authenticateUser(userName, password).isDefined
if (authenticated) {
val role = UserLogin.getUserRole(userName, password)
Json.obj("login_status" -> "Success", "result" -> role)
}
else {
Json.obj("login_status" -> "Failure", "result" -> 0)
}
}
}
}
在处理 jsonReq
时使用 catchAll 方法,该方法期望获得结果的接收者并且该结果可能会抛出 Exception
。在 Exception
的情况下,它将使用带有内部服务器错误的默认消息,并将此消息发送给接收者。
您还可以使 out
参数隐式设置,从而跳过将它放在任何地方的步骤。此外,您的代码并不是真正的 Scala 风格。使用 vars
等...
如果无法解析发送到 WS 的 json,它将在到达您的代码之前抛出异常,可以在此处找到解决方案:
How do I catch json parse error when using acceptWithActor?
我在 Scala 中使用带有 Play Framework 的网络套接字。我想在我的项目中使用 Try/Catch
功能来捕获一些 Exceptions
,例如 Server Exception
、Network Exception
等
我做了什么:
WebSocketController.scala
object LoginWS {
def props(out: ActorRef) = Props(new LoginWS(out))
}
class LoginWS(out: ActorRef) extends Actor {
def receive = {
case json_req: JsObject =>
var user_name = (json_req \ "user_name").as[String]
var password = (json_req \ "password").as[String]
var source = (json_req \ "source_type").as[String]
var result = UserLogin.authenticateUser(user_name, password).isDefined
var userID: Int = 0;
if(result) {
userID = UserLogin.getUserRole(user_name, password)
val login_status : String = "Success"
out ! Json.toJson(JsObject(Seq("login_status" -> JsString(login_status), "user_id" -> JsNumber(userID))))
}
else {
val login_status : String = "Failure"
out ! Json.toJson(JsObject(Seq("login_status" -> JsString(login_status), "user_id" -> JsNumber(userID))))
}
}
}
object WebSocketController extends Controller {
def login = WebSocket.acceptWithActor[JsValue, JsValue] { request =>
out => LoginWS.props(out)
}
}
我尝试了什么:
我用过this answer posted by Ende Neu,但显示not found: value APIAction
。注意:我也在 routes 文件中添加了 APIAction
代码:
class LoginWS(out: ActorRef) extends Actor {
def receive = APIAction { request
case json_req: JsObject =>
.....
....//code here
}
}
object WebSocketController extends Controller {
def login = WebSocket.acceptWithActor[JsValue, JsValue] { request =>
out => LoginWS.props(out)
}
def APIAction(f: Request[AnyContent] => Result): Action[AnyContent] =
Action { request =>
Try(f(request))
.getOrElse(
InternalServerError(Json.obj("code" -> "500", "message" -> "Server error"))
)
}
}
请帮助我在 Web socket
登录请求在 actor 中处理,我认为你应该在那里处理你的错误。如果您想捕获所有异常而不是显式处理可能出错的地方,我建议执行以下操作
object SomeUtils {
def catchAll[A](out: ActorRef)(f: => A): Unit = {
val message = Try(f).getOrElse(Json.obj("code" -> "500", "message" -> "Server error"))
out ! message
}
}
import SomeUtils._
class LoginWS(out: ActorRef) extends Actor {
def receive = {
case json_req: JsObject => catchAll(out) {
val userName = (json_req \ "user_name").as[String]
val password = (json_req \ "password").as[String]
val authenticated = UserLogin.authenticateUser(userName, password).isDefined
if (authenticated) {
val role = UserLogin.getUserRole(userName, password)
Json.obj("login_status" -> "Success", "result" -> role)
}
else {
Json.obj("login_status" -> "Failure", "result" -> 0)
}
}
}
}
在处理 jsonReq
时使用 catchAll 方法,该方法期望获得结果的接收者并且该结果可能会抛出 Exception
。在 Exception
的情况下,它将使用带有内部服务器错误的默认消息,并将此消息发送给接收者。
您还可以使 out
参数隐式设置,从而跳过将它放在任何地方的步骤。此外,您的代码并不是真正的 Scala 风格。使用 vars
等...
如果无法解析发送到 WS 的 json,它将在到达您的代码之前抛出异常,可以在此处找到解决方案:
How do I catch json parse error when using acceptWithActor?