当前位置: 首页 > 知识库问答 >
问题:

Scala Akka HTTP强制转换参数为java.time.ZonedDateTime

齐永昌
2023-03-14

我正在使用Akka HTTP(在Scala中)开发一个REST服务。我希望传入http get请求的参数转换为ZonedDateTime类型。如果我尝试使用String或Int但在使用ZonedDateTime类型时失败,则代码可以正常工作。代码如下所示:

parameters('testparam.as[ZonedDateTime])

下面是我看到的错误:

Error:(23, 35) type mismatch;
 found   : akka.http.scaladsl.common.NameReceptacle[java.time.ZonedDateTime]
 required: akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet
          parameters('testparam.as[ZonedDateTime]){

如果我向列表中添加多个参数,我会得到一个不同的错误:

Error:(23, 21) too many arguments for method parameters: (pdm: akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet)pdm.Out
          parameters('testparam.as[ZonedDateTime], 'testp2){

下面是一个代码片段,它将重现我看到的问题

import java.time.ZonedDateTime

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer

import scala.io.StdIn


object WebServer {
  def main(args: Array[String]) {

    implicit val system = ActorSystem("my-system")
    implicit val materializer = ActorMaterializer()
    // needed for the future flatMap/onComplete in the end
    implicit val executionContext = system.dispatcher

    val route =
      path("hello") {
        get {
          parameters('testparam.as[ZonedDateTime]){
            (testparam) =>
              complete(testparam.toString)
          }
        }
      }

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)

    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
    StdIn.readLine() // let it run until user presses return
    bindingFuture
      .flatMap(_.unbind()) // trigger unbinding from the port
      .onComplete(_ => system.terminate()) // and shutdown when done
  }
}

共有1个答案

袁俊弼
2023-03-14

由于zoneddatetime不是由Akka-HTTP自动解封的,您需要为parameters指令提供一个自定义的解封程序。

在这里的文档中简要描述了该功能。

可以使用unmarshaller.strict从函数创建反封送器,例如。

  val stringToZonedDateTime = Unmarshaller.strict[String, ZonedDateTime](ZonedDateTime.parse)
parameters("testparam".as(stringToZonedDateTime)){
            (testparam) =>
              complete(testparam.toString)
          }
 类似资料:
  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 现在,我有一个类,它能够添加相同数据类型的向量。对于不同的类型,我必须调用显式转换: 是否可以将向量隐式转换为函数“运算符+()”?下面是我的向量代码:

  • 我希望将一个< code>int数组转换为一个< code>double数组。 所以,当我有 我想使用,比如说把它作为参数传递给一个方法。 最好的方法是什么? 演员阵容 不工作。 我可以迭代通过: 有没有更好的方法来做到这一点? <代码>系统。arraycopy不起作用——不适用于两种不同基元类型的数组。 注意:在Java和其他一些讨论中,我们看到了将对象转换为数组。 蒂亚。

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案