Spray的需要错误消息很丑......我该如何自定义?

时间:2015-09-02 23:42:14

标签: scala jackson spray

我正在使用Spray编写Web应用程序,并使用本文底部描述的案例类验证方法:

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

效果很好,但我对退回客户端的消息感到不满意。除了它丑陋的事实,它暴露了一些关于后端的细节:

  

请求内容格式错误:   [simple type,class com.mycompany.models.users.User $ Login]值的实例化失败:要求   失败:电子邮件地址无效(通过参考链:   com.mycompany.models.users.Login [ “密码”])

我想说,只是

  

电子邮件地址无效

关于如何做到这一点的任何想法?

更新

我已经实现了@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 个答案:

答案 0 :(得分:3)

使用Spray,您可以通过创建自定义异常处理程序来完成此操作。以下是their page describing it的示例:

SerialNumbersMatch.txt

请注意,它是一个隐式定义,因此当您定义服务时,您需要做的就是将其放在范围内,并且它将被拾取。任何未处理的错误都将默认为其原始值。与大多数异常处理情况一样,我鼓励您在决定处理哪些异常时非常具体。

既然你说它实际上是拒绝,而不是例外,我会添加rejection handling的链接及其示例:

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>`
  }
}

同样,我们看到该对象是一个隐含的定义,因此您需要将其放在范围内才能被拾取。