Akka通用自定义指令

时间:2017-03-14 16:58:34

标签: scala akka akka-http

我使用自定义指令来验证我的参数:

  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]。?)

为什么?

0 个答案:

没有答案