Http4s EntityDecoder不是为简单案例类自动派生的

时间:2017-10-29 13:49:46

标签: circe http4s http4s-circe

我收到此错误:

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.

以下案例类:

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"
}

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

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

有任何想法/建议吗?

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

2 个答案:

答案 0 :(得分:2)

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

为我解决了案例类的自动编码为JSON。

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

答案 1 :(得分:1)

答案是:

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

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