我想使用一种带Play的WebSocket类型!阶。
我希望WebSocket.acceptOrResult
接受一些命令,如:
case class Message(msg: String)
case class CommandA(c: String)
等。
我可以用
WebSocket.acceptOrResult[JsValue, JsValue]
并尝试按顺序将它们转换为不同的case类(命令),但我发现它很难看。
如果可能的话,更好的方法是使用密封特性
ChatEvent
并扩展命令类,即
case class Message(msg: String) extends ChatEvent
case class CommandA(c: String) extends ChatEvent
但如果我按照以下方式使用它,则不接受命令:
implicit val acommandFlowTransformer =
MessageFlowTransformer.jsonMessageFlowTransformer[ChatEvent, ChatEvent]
def openSocket = WebSocket.acceptOrResult[ChatEvent, ChatEvent]
我用过
import julienrf.json.derived
implicit val chatEventMessage: Format[ChatEvent] = derived.oformat[ChatEvent]
允许我这样做:
Json.toJson(CommandA("aaa")).validate[ChatEvent] ---> JsSuccess[CommandA]
IMO的问题是,ChatEvent
的格式导致扩展ChatEvent
的类和acceptOrResult
正在等待ChatEvent
。
也许解决方案是使用类似的东西:
def openClientSocket = WebSocket.acceptOrResult[_ :< ChatEvent, _ :< ChatEvent]
但是我找不到如何编译它。