我使用自定义指令来验证我的参数:
def optionalIntParamAs[C](parameterName: String, validator: Int => C Or ErrorMessage): Directive1[Option[C]] =
parameter(parameterName.as[Int].?)
.recoverPF[Tuple1[Option[Int]]] {
case Seq(MalformedQueryParamRejection(name, msg, cause)) =>
reject(MalformedQueryParamRejection(name,
s"Invalid value '${msg.split("'")(1)}' for query parameter '$name'.", cause))
}
.flatMap {
case Some(intParam) =>
validator(intParam) match {
case Good(c) => provide(Some(c))
case _ => reject(ValidationRejection(s"Invalid value '$intParam' for query parameter '$parameterName'."))
}
case _ => provide(None)
}
在我的路线中用作:
optionalIntParamAs[PageSize]("pageSize", PageSize.validate) { pageSize =>
...
}
我想有一个通用指令,所以我可以写:
optionalParam[Int].as[PageSize]
optionalParam[String].as[...]
有什么建议吗?
更新:使用Stefano的解决方案,我们将收到此编译错误:
发现:akka.http.scaladsl.common.NameOptionReceptacle [In] [error] 需要: akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet [error]参数(parameterName.as [In]。?)
为什么?