akka http没有正确处理带有美元符号的参数?

时间:2017-10-20 10:12:09

标签: scala akka akka-http

我在我的路线中定义了(OData)查询参数,如下所示:

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>

我有以下拒绝处理程序来处理所有无效参数(handleAll):

RejectionHandler.newBuilder()
  .handleAll[MalformedQueryParamRejection] { paramRejections =>
    // paramRejections is a Seq[MalformedQueryParamRejection]
    ...
  }

问题在于使用以下

调用时
some-endpoint?$top=invalid&$skip=invalid

拒绝处理程序中的paramRejections有两个条目,两个代表$ top,而不是一个用于$ top,一个用于$ skip。

似乎与params上的美元符号有关,因为当我删除这些东西按预期工作时。这是一个已知问题还是有可用的解决方法(不包括删除美元符号)?

注意,它似乎只有拒绝处理程序有多个params以美元符号开头的问题,因为当$ top和$ skip提供有效值时,路由中的这一行正确分配top并跳转到变量在URI中:

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>

1 个答案:

答案 0 :(得分:1)

路由树配置存在问题,可能会评估两个候选路由,每个路由为MalformedQueryParamRejection查询参数生成$top

  

拒绝处理程序中的paramRejections有2个条目,均为$ top,而不是$ top的一个条目和$ skip的一个条目。

handleAll不会收集来自同一路线的多个MalformedQueryParamRejection,但会收集来自不同路线的拒绝。

paramRejectionsSeq[MalformedQueryParamRejection],但只有一个MalformedQueryParamRejection可以拒绝单个路由,特别是(仅)第一个查询参数与所需格式不匹配。

尝试使用最小route配置(如下例所示),您将体验到正确的行为:

val route = get {
  parameters(('$top.as[Int].?, '$skip.as[Int].?)) {
    (top, skip) => complete(s"$top, $skip")
  }
}