我正在使用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"
如何在不进行字符串操作的情况下获取我的确切错误消息?
答案 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>`
}
}
同样,我们看到该对象是一个隐含的定义,因此您需要将其放在范围内才能被拾取。