Http4s EntityDecoder 不是针对简单情况自动派生的 class

Http4s EntityDecoder not being auto derived for simple case class

我收到这个错误:

Cannot decode into a value of type com.blah.rest.model.UserProfile, 
because no EntityDecoder[cats.effect.IO, com.blah.rest.model.UserProfile] 
instance could be found.

对于以下情况class:

case class UserProfile(id: Option[Int], firstName: String, lastName: String)

POST 代码上遇到错误:

case req @ POST -> Root / "v1" / "profiles" =>
  req.as[UserProfile] flatMap {(up: UserProfile) =>
    Ok(service.createProfile(up).asJson)
  }

正文如下POST

{
   "firstName": "Jack",
   "lastName": "Appleseed"
}

我认为当正文在 req.as[UserProfile] 中转换为 UserProfile 时会发生这种情况!

但是,这是一个普通的案例 class,EntityDecoder 应该是自动派生的!我知道 akka-http 做到了!

任何ideas/suggestions?

请注意:Http4sVersion = "0.18.0-M4"circe version "0.9.0-M1"

答案是:

req.decodeJson[UserProfile] flatMap {(up: UserProfile) =>
    Ok(service.createProfile(up).asJson)
  }

你得到它的原因是从 Circe 解码器到 http4s EntityDecoder 的桥梁不是隐含的。如果你纯粹是 JSON API,你可以做一个,但这不是图书馆通常可以做的假设。

添加此依赖项: "io.circe" %% "circe-generic" % "0.9.1"

为我解决了 类 到 JSON 的自动编码问题。

它允许所需的导入:import io.circe.generic.auto._