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

标签 scala akka akka-http

我在我的 route 定义了(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在拒绝处理程序中有 2 个条目,两者 $top,而不是 $top 和 $skip 一个。

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

请注意,似乎只有拒绝处理程序存在以美元符号开头的多个参数的问题,因为当 $top 和 $skip 在 URI 中提供有效值时,路由中的这一行正确地将 top 和 skip 分配给变量:
parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) =>

最佳答案

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

The paramRejections in the rejection handler has 2 entries, both for $top, instead of one for $top and one for $skip.


handleAll不收集多个 MalformedQueryParamRejection来自同一条路由,但它收集来自不同路由的拒绝。
paramRejectionsSeq[MalformedQueryParamRejection]但是只有一个 MalformedQueryParamRejection 可能会拒绝单个路由,特别是(仅)与所需格式不匹配的第一个查询参数。

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

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

关于scala - akka http 没有正确处理带有美元符号的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46846925/

相关文章:

java - Mockito Scala 重载方法值 thenReturn 和替代方案

java - Scala - InvalidClassException : no valid constructor

scala - 创建在构造函数中隐含的akka​​ actor

java - Http Websocket 作为 Akka 流源

scala - akka Stream 将 akka-htpp Web 请求调用集成到流中

scala - Akka Streams - Source.unfoldAsync 的背压

java - 为什么启用某些异常的调试速度要慢得多?

scala - SortedMap 中最近的键

scala - akka actor 中的消息传递序列

scala - Play框架重启时如何重新加载akka调度程序