2016-12-24 1 views
0

donné une classe de cas avec un besoinComment jeter des messages à la réponse http de la classe affaire ont besoin?

case class Foo(id: Int, value: Int) { 
    require(value < 0 "value must be bigger than zero") 
} 

est possible de lancer ce message à http?

val routes = pathPrefix("foos") { 
    pathEnd { 
     post { 
     entity(as[Foo]) { foo => 
      saveFoo(foo) match { 
      case Success(p) => { 
       complete(StatusCodes.Created) 
      } 
      case Failure(f) => { 
       println(f.getMessage) // unknown error 
       complete(BadRequest, f.getMessage) 
      } 
      } 
     } 
     } 
    } 

Répondre

1

L'infrastructure Akka-HTTP déjà convertir toutes les erreurs survenant au cours unmarshalling dans une erreur 400 (BadRequest), et le message d'exception sera automatiquement utilisé.

Avec votre même code, j'obtiens ce comportement gratuitement. De petits changements que je fait:

  • l'erreur de logique métier est maintenant un 500, pour éviter toute confusion

  • l'exigence de classe affaire est maintenant compatible avec le message (> est nécessaire au lieu de <).


case class Foo(id: Int, value: Int) { 
    require(value > 0, "value must be bigger than zero") 
    } 

    def saveFoo(foo: Foo): Try[Unit] = Success(()) 

    val route = pathPrefix("foos") { 
    pathEnd { 
     post { 
     entity(as[Foo]) { foo => 
      saveFoo(foo) match { 
      case Success(p) => { 
       complete(StatusCodes.Created) 
      } 
      case Failure(f) => { 
       println(f.getMessage) // unknown error 
       complete(StatusCodes.InternalServerError, f.getMessage) 
      } 
      } 
     } 
     } 
    } 
    } 
+0

C'est ce que je pensais aussi. Mais le message de f.getMessage est "erreur inconnue" – coffee

+0

Cela vous bloque lorsque vous imprimez 'f.getMessage' est évalué dans le cas où votre méthode' saveFoo' renvoie un échec. Si vous imprimez 'f.getMessage' cela signifie que le unmarshalling était correct et que l'erreur était plus tardive. Le rejet des erreurs de désassemblage avec BadRequest se passe sous le capot, sans avoir besoin d'ajouter de code. –