scala - HttpRoutes[RIO[E, *]] 和 HttpRoutes[zio.Task] 之间的编译问题
问题描述
试图编译这个小型 ZIO 友好的 Tapir/Http4s 端点描述
import io.circe.generic.auto._
import org.http4s.HttpRoutes
import sttp.tapir.json.circe
import sttp.tapir.ztapir._
import sttp.tapir.server.http4s.ztapir._
import sttp.tapir.endpoint
import zio.RIO
import zio.interop.catz._
case class HealthReplyDTO(message: String)
final class HealthEndpointZTapir[E]() {
private val prefixPath = "/health"
val healthOkReply = HealthReplyDTO("OK")
private val routeDescription: ZEndpoint[Unit, Unit, HealthReplyDTO] =
endpoint.get.in(prefixPath).out(circe.jsonBody[HealthReplyDTO]).description("Health Endpoint")
val route: HttpRoutes[RIO[E, *]]
= routeDescription.toRoutes( _ => RIO.succeed(healthOkReply))
}
并继续把它放在最后一行。
Type mismatch. Required: HttpRoutes[RIO[E, *]], found: HttpRoutes[zio.Task]
任务是 RIO 的子类型,所以这应该可以正常工作吧?或者我在这里错过了什么。这个世界有点菜鸟,所以非常感谢一些帮助。
解决方案
Task
确实是 的子类型RIO[R, *]
,但从HttpRoutes
http4s 是不变的,因此错误消息。
该.toRoutes
方法HttpRoutes[Task]
作为与 http4s 集成的结果返回,它没有输入错误。一般来说,http4s 在设置服务器和处理路由时会抛出任何类型的异常,所以我们需要使用Task
.
推荐阅读
- jquery - 使用基于类名和 id 的 jquery 添加类
- json - 角度对象持久性问题
- javascript - 我可以将 onmouseover 用于 div 吗?
- elasticsearch - 如何使用logstash将Kafka主题键值索引为字段?
- sql - 返回具有所有外键的行
- flutter - 如何将弹出菜单按钮中的选定项目显示为文本?
- database-design - 从单个表中唯一标识多个实体类型的图像 - 一般设计实践
- typescript - 如果字符串与枚举成员不同,如何从枚举中获取字符串值?
- node.js - 如何从节点编辑 JSON 文件中的数组?
- java - 如何使用 Spring Cloud Gateway 自定义过滤器过滤每个请求?