Joda Marshalling/Unmarshalling in scala



我正在尝试使用akka.http.scaladsl.testkit.responseAs来测试一些端点,但是我不知道如何处理org.joda.time.DateTime对象的编组/解组过程。例如,考虑下面的案例类:

case class ConfigEntity(id: Option[Int] = None, description: String, key: String, value: String, expirationDate: Option[DateTime] = None)

此外,请考虑以下路由测试:

"retrieve config by id" in new Context {
  val testConfig = testConfigs(4)
  Get(s"/configs/${testConfig.id.get}") ~> route ~> check {
    responseAs[ConfigEntity] should be(testConfig)
  }
}

当我运行"sbt test"时,代码无法编译,引发以下错误:"找不到类型为 akka.http.scaladsl.unmarshalling.FromResponseUnmarshaller[me.archdev.restapi.models.ConfigEntity]的证据参数的隐式值">

我知道该消息非常不言自明,但我仍然不知道如何创建代码抱怨的隐式 FromResponseUnmarshaller。

我的代码基于以下示例:https://github.com/ArchDev/akka-http-rest

我只是在创建一些新实体并尝试玩弄......

提前谢谢。

这个项目使用CirceSupport。这意味着你需要为编译器提供一个Circe Decoder来派生Akka Http Unmarshaller。

将解码器置于范围内:

case class ConfigEntity(id: Option[Int] = None, description: String, key: String, value: String, expirationDate: Option[DateTime] = None)
implicit val decoder = Decoder.decodeString.emap[DateTime](str =>
  Right(DateTime.parse(str))
)
"retrieve config by id" in new Context {
  val testConfig = testConfigs(Some(4))
  Get(s"/configs/${testConfig.id.get}") ~> route ~> check {
    responseAs[ConfigEntity] should be(testConfig)
  }
}

显然,您必须处理尝试解析日期时间并返回 Left 而不是 Right...

必须说,我总是使用SprayJsonSupport来支持Akka Http,这是我第一次看到CirceSupport。

希望这有帮助。

相关内容

  • 没有找到相关文章