我已经为ZIO应用程序创建了HttpRoutes
class BlockChainAPI[R <: BlockChain] {
type BlockChainTask[A] = RIO[R, A]
private val dsl = Http4sDsl[BlockChainTask]
import dsl._
implicit def jsonDecoder[A](implicit decoder: Decoder[A]): EntityDecoder[BlockChainTask, A] = jsonOf[BlockChainTask, A]
implicit def jsonEncoder[A](implicit encoder: Encoder[A]): EntityEncoder[BlockChainTask, A] = jsonEncoderOf[BlockChainTask, A]
val routes: HttpRoutes[BlockChainTask] = HttpRoutes.of[BlockChainTask] {
case GET -> Root / "message" / message =>
val newMessage = BlockMessage(message)
BlockChain
.addBlock(Seq(newMessage))
.foldZIO(
err => BadRequest(err.getMessage),
_ => Ok(s"Message $message added")
)
}
}
字符串
它工作正常!但今天我添加了一个新的路由:
case GET -> Root =>
StaticFile.fromPath(fs2.io.file.Path("/api-docs/index.html")).getOrElse(NotFound()).foldZIO(
err => InternalServerError(err.getMessage),
result => Ok(result)
)
型
它失败并出错:无法从具有java.io.Serializable的产品转换为实体,因为找不到UnityEncoder [[A]zio.ZIO[R,Throwable,A],Product with java.io.Serializable]示例。
也许有人知道怎么修!
我补充道:
implicit def jsonEncoder2[A <: Product with Serializable](implicit encoder: Encoder[A]): EntityEncoder[BlockChainTask, A] = jsonEncoderOf[BlockChainTask, A]
型
但它不起作用
1条答案
按热度按时间qv7cva1a1#
你的
result
有一个Product with Serializable
类型,这是http4s不知道如何在HTTP响应中编码的。这是因为
StaticFile.fromPath(fs2.io.file.Path("/api-docs/index.html")).getOrElse(NotFound())
实际上给了你两个不相关的类型,这取决于你是通过nominal路径还是getOrElse
路径。您需要在两个路径中返回一致的类型,或者在此阶段不使用
getOrElse
,或者将缺少的大小写移到错误通道。使用带有显式类型的中间变量应该会有所帮助。