Что такое эквивалент Play 2.5.x для acceptWithActor [String, JsValue]?

До того, как я перешел на Play 2.5.x, я часто использовал WebSocket.acceptWithActor. Теперь я не могу заставить свои веб-сокеты оставаться открытыми при использовании разных входных и выходных данных, в моем случае вход - String, вывод - JsValue.

Мой приемник перед воспроизведением 2.5.x:

object Application extends Controller {
    def myWebSocket = WebSocket.acceptWithActor[String, JsValue] { request =>
        out => MyActor.props(out)
}

Мой приемник в Play 2.5.x:

@Singleton
class Application @Inject() (implicit system: ActorSystem, materializer: Materializer) extends Controller {
  implicit val messageFlowTransformer = 
                  MessageFlowTransformer.jsonMessageFlowTransformer[String, JsValue]
  def myWebSocket = WebSocket.accept[String, JsValue] { request =>
    ActorFlow.actorRef(out => MyActor.props(out))
  }
}

В моем акторе preStart вызывается сразу после postStop, поэтому это явно неверно, но я не могу найти какое-либо решение в документации (https://www.playframework.com/documentation/2.5.x/ScalaWebSockets). Если я использую WebSocket.accept[String, String], сокет остается открытым.

Что я делаю неправильно?

Ответы

Ответ 1

Я нашел рабочий стол

Мой контроллер:

    ActorFlow.actorRef[String, JsValue](out =>
      MyActor.props(
         out,
         ...
      )
    ).map(_.toString)

С этим вы не определяете настраиваемый преобразователь сообщений и на уровне актера вы все равно можете получать строки и возвращать JsValues.