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

Ror*_*ory 5 scala akka akka-http

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

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>
Run Code Online (Sandbox Code Playgroud)

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

RejectionHandler.newBuilder()
  .handleAll[MalformedQueryParamRejection] { paramRejections =>
    // paramRejections is a Seq[MalformedQueryParamRejection]
    ...
  }
Run Code Online (Sandbox Code Playgroud)

问题是当用以下方法调用时

some-endpoint?$top=invalid&$skip=invalid
Run Code Online (Sandbox Code Playgroud)

paramRejections被拒绝处理器有2个条目,为$顶部,而不是一个$顶部,一个为$跳过.

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

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

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>
Run Code Online (Sandbox Code Playgroud)

Fed*_*tta 1

您的路由树配置存在问题,可能会评估两条候选路由,并且每条路由都会生成一个MalformedQueryParamRejection查询$top参数。

拒绝处理程序中的 paramRejections 有 2 个条目,均针对 $top,而不是 1 个针对 $top,1 个针对 $skip。

handleAll不收集MalformedQueryParamRejection来自同一路由的多个源自,但它收集来自不同路由的拒绝。

paramRejections是一个Seq[MalformedQueryParamRejection]但单个路由可能会被拒绝MalformedQueryParamRejection,特别是(仅)第一个查询参数与所需格式不匹配。

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

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