2017-09-08 4 views
1

J'utilise websockets dans Play framework 2.3.Comment intercepter une erreur d'analyse JSON lors de l'utilisation de acceptWithActor avec des types personnalisés?

Référence à cet extrait de the official how-to page.

import play.api.mvc._ 
import play.api.Play.current 

def socket = WebSocket.acceptWithActor[InEvent, OutEvent] { request => out => 
    MyWebSocketActor.props(out) 
} 

Comment est-ce que j'attraperais une erreur d'analyse JSON (RuntimeException: Erreur d'analyse JSON)?

Cette question est très similaire à celle ci-dessous, cependant, j'utilise des types personnalisés (InEvent, OutEvent) et pas le type JsValue. Je ne veux pas transformer en JsValue ou en chaîne. J'en ai besoin pour se transformer en type InEvent en cas de succès, ou lancer une erreur plus descriptive.

How do I catch json parse error when using acceptWithActor?

Répondre

2

Quelque part dans votre champ il y a des définitions implicites de FrameFormatter[InEvent] et FrameFormatter[OutEvent]:

implicit val inEventFrameFormatter = FrameFormatter.jsonFrame[InEvent] 
implicit val outEventFrameFormatter = FrameFormatter.jsonFrame[OutEvent] 

Il vous suffit de réécrire les deux, au lieu d'utiliser la jsonFrame prédéfinie une méthode personnalisée comme customJsonFrame:

def customJsonFrame[A: Format]: FrameFormatter[A] = 
    FrameFormatter.jsonFrame.transform[A](
    out => Json.toJson(out), 
    in => Json.fromJson[A](in).fold(
     error => throw new CustomException(), 
     a => a 
    ) 
) 

et remplacer les lignes ci-dessus avec:

implicit val inEventFrameFormatter = customJsonFrame[InEvent] 
implicit val outEventFrameFormatter = customJsonFrame[OutEvent] 
+0

qui fonctionne. Merci! –