我有以下喷涂路线
post {
parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import){imp =>
complete {
adImporterService ! imp
StatusCodes.Accepted
}
}
}
用于转换为 TypNe 的 Java 枚举的自定义反序列化器:
implicit val propertyTypeDeserializer = new Deserializer[String,TypNe]{
def apply(s:String):Deserialized[TypNe]={
Try(TypNe.valueOf(s.toUpperCase)) match {
case Success(tn) => Right(tn)
case Failure(ex) => Left(MalformedContent(s"Wrong property type. Accepted values: ${TypNe.values}", Some(ex)))
}
}
}
和 Import case 类定义如下:
case class Import(adId: String, propertyType:TypNe){
require(adId!= null && !adId.isEmpty && propertyType!=null,"adId parameter cannot be null or empty and propertyType has to be defined")
}
期望和预期的行为是抛出的 IllegarArgumentException 绑定到响应代码 400 - BadRequest。但我收到响应代码 500 - 内部服务器错误。
我正在使用默认拒绝处理程序
class MainService(route: Route) extends HttpServiceActor {
implicit val system = context.system
import spray.routing.RejectionHandler.Default
override def receive: Receive = runRoute(route)
}
使用默认的 ExceptionHandler - 将 NonFatal 异常转换为 InternalServer 错误。
实现所需行为的最佳实践是什么?
在我看来,创建自定义 ExceptionHandler 是一种不正确的方法。我可能需要在参数指令中实现 IllegalArgumentException 到 MalformedQueryParamRejection 的转换。
任何人都可以提示如何实现它吗?
谢谢
更新:尝试了不同的方法,但也没有按预期工作。
post {
parameters(('adId.as[String], 'propertyType.as[String])) { (id,pT) =>
validate(Try(TypNe.valueOf(pT)).isSuccess,s"propertyType $pT is not a valid ${TypNe.values()}")
validate(id!= null && !id.trim.isEmpty,"adId parameter cannot be null or empty ")
complete {
adImporterService ! Import(id, TypNe.valueOf(pT))
StatusCodes.Accepted
}
}
}