使用akka http unmarshall实体作为具有默认值的案例类时出错

时间:2018-08-22 10:31:44

标签: scala akka akka-http

我发送http发布请求时发现错误:

  

请求内容格式不正确:没有可用的性别值   找不到可以转换为java.lang.String

的值

我的请求正文:

{
    "name":"test"
} 

使用我的Scala代码进行路由:

path("test"){
        (post(entity(as[People]) { req =>
          val resp = queryData(req)
          complete(resp.meta.getOrElse("statusCode", 200).asInstanceOf[Int] -> resp)
        }))
    } ~

People的代码:

case class People(name: String, gender: String = "male")

为什么仍然出现malformed错误???

1 个答案:

答案 0 :(得分:2)

即使您输入默认值,Json的提取也将查找该字段,并且该字段不存在,因此将失败。 (我假设您使用的是Spray-json,因为它是akka-http中的默认设置)

为了避免这个问题,在保持简单的同时,我建议您为创建人员的请求创建一个案例类,其中包含该字段的Option [String],然后可以将PeopleCreateRequest转换为一个人很容易。

case class PeopleCreateRequest(name: String, gender: Option[String])

这将很好地与框架配合使用...

或者,如果您希望保持这种设计,则需要考虑实现自己的JsonFormat [People],它将将此值视为可选值,但在缺少时添加默认值。

查看spray-json https://github.com/spray/spray-json#providing-jsonformats-for-other-types

但是我想这会是这样的:

implicit val peopleFormat = new RootJsonFormat[People] {
    def read(json: JsValue): People = json match {
      case JsArray(Seq(JsString(name), JsString(gender))) =>
        People(name, gender)
      case JsArray(Seq(JsString(name))) =>
        People(name)
      case _ => deserializationError("Missing fields")
    }

    def write(obj: People): JsValue = ???
  }

我通常使用不同的JsonSupport和circe,但希望这会为您提供解决问题的方向