2016-12-24 26 views
0

給定的情況下,類任何需要如何將消息從case類中發送到http響應需要?

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

可能拋出這個消息到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) 
      } 
      } 
     } 
     } 
    } 

回答

1

的阿卡-HTTP基礎設施將已解組轉換成400 (BadRequest)錯誤期間發生的所有錯誤,並會自動使用的異常信息。

使用相同的代碼,我可以免費獲得該行爲。小的變化我做:現在

  • 業務邏輯錯誤是500,爲了避免混淆

  • 的情況下等級要求現在與信息一致(>需要,而不是<)。


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

這就是我想,也是。但是來自f.getMessage的消息是「未知錯誤」 – coffee

+0

阻止了你在哪裏打印'f.getMessage'是在你的方法'saveFoo'返回失敗的情況下評估的。如果你正在打印'f.getMessage',這意味着解組很好,錯誤在後面。用BadRequest拒絕編組錯誤發生在引擎蓋下,而不需要添加任何代碼。 –

相關問題