2015-09-02 19 views
2

我正在寫在噴霧Web應用程序和現在用在這篇文章的底部描述的情況類驗證方法:Spray的要求錯誤信息很難看......我如何定製?

http://spray.io/documentation/1.2.3/spray-routing/advanced-topics/case-class-extraction/

它的偉大工程,但我不滿意消息返回客戶端。除了事實,即它是醜陋的,它揭露了後端的一些細節:

請求內容的格式不正確: 實例化[簡單類型,類com.mycompany.models.users.User $登錄]值失敗:要求 失敗:無效的電子郵件地址(通過參考鏈: com.mycompany.models.users.Login [ 「密碼」])

我想不必多說,只是

無效的電子郵件地址ess

有關如何完成此任何想法?

更新

我實現什麼建議@soong,但最好不是很大(到目前爲止)。

我需要的代碼是require(!zipcode.isEmpty, "Invalid zipcode")

我拒絕處理代碼:

implicit def validationRejectionHandler = RejectionHandler { 
    case MalformedRequestContentRejection(msg, cause) :: _ => 
     complete(BadRequest, s"$msg") 
    } 

的問題是,我想要的消息(「郵政編碼無效」)被包裹在一些其他的文字:

cause.detailMessage = "requirement failed: Invalid zipcode"

任何方式來得到我的確切的錯誤消息,而不必做字符串操作?

+1

您是否熟悉製作自定義異常處理程序? http://spray.io/documentation/1.2.2/spray-routing/key-concepts/exception-handling/ – childofsoong

+0

沒有。這很好。謝謝! – threejeez

+0

那麼我會讓它成爲答案。 – childofsoong

回答

3

使用Spray,您可以通過創建自定義異常處理程序來完成此操作。下面是來自their page describing it的例子:

import spray.util.LoggingContext 
import spray.http.StatusCodes._ 
import spray.routing._ 

implicit def myExceptionHandler(implicit log: LoggingContext) = 
    ExceptionHandler { 
    case e: ArithmeticException => 
     requestUri { uri => 
     log.warning("Request to {} could not be handled normally", uri) 
     complete(InternalServerError, "Bad numbers, bad result!!!") 
     } 
    } 

class MyService extends HttpServiceActor { 
    def receive = runRoute { 
    `<my-route-definition>` 
    } 
} 

請注意,這是一個隱含的定義,所以當你要定義你的服務,你需要做的是有它的範圍,它會有所回升。任何未由其處理的錯誤都將默認爲其原始值。與大多數異常處理情況一樣,我鼓勵您在決定處理哪些異常時非常具體。

既然你說這其實是一種排斥,也不例外,我將添加鏈接rejection handling,它的例子:

import spray.routing._ 
import spray.http._ 
import StatusCodes._ 
import Directives._ 

implicit val myRejectionHandler = RejectionHandler { 
    case MissingCookieRejection(cookieName) :: _ => 
    complete(BadRequest, "No cookies, no service!!!") 
} 

class MyService extends HttpServiceActor { 
    def receive = runRoute { 
    `<my-route-definition>` 
    } 
} 

再一次,我們看到的對象是一個隱含的定義,因此你需要在範圍內找到它。

+0

感謝您的幫助...精美地工作! – threejeez

+1

很高興能幫到你!當我嘗試測試一個基於Spray的API時,我第一次遇到了這些問題,並且我不知道我需要單元測試範圍內的處理程序來驗證路由。 *這讓我花了一段時間才弄清楚! – childofsoong

+0

事實上,我說得太快......它不太漂亮。我上面編輯了我的問題。思考? – threejeez