Спрей - ошибка проверки параметров запроса не приводит к коду состояния 400 - badRequest
У меня следующий маршрут распыления
post {
parameters(('adId.as[String], 'propertyType.as[TypNe])).as(Import){imp =>
complete {
adImporterService ! imp
StatusCodes.Accepted
}
}
}
Настраиваемый десериализатор для преобразования в перечисление Java TypNe:
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)))
}
}
}
Класс импорта класса определяется следующим образом:
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 - Внутренняя ошибка сервера.
Я использую RejectionHandler по умолчанию
class MainService(route: Route) extends HttpServiceActor {
implicit val system = context.system
import spray.routing.RejectionHandler.Default
override def receive: Receive = runRoute(route)
}
по умолчанию ExceptionHandler - который преобразует исключение NonFatal в ошибку Internal Server.
Какова наилучшая практика для достижения желаемого поведения?
Создание пользовательского 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
}
}
}