gpt4 book ai didi

scala - 如何使用 Scala 在路由上绑定(bind)枚举?

转载 作者:行者123 更新时间:2023-12-05 05:00:57 25 4
gpt4 key购买 nike

我正在尝试接收一些过滤器列表作为 get 请求的查询参数,这也是我 Controller 上的一个枚举。为此,我在 scala 中使用了 play 框架。问题是:我无法将枚举类型作为查询参数放在上面,因为 IDE 无法识别为有效类型。

所以,我在路由文件中有这样的东西

GET/service-orders/controllers.ServiceOrdersController.listServiceOrders(状态:ServiceStatus)

我的枚举文件:

object ServiceStatus extends Enumeration {

type ServiceStatus = Value

val Pending = Value("pending")
val Started = Value("started")
val Completed = Value("completed")
val Error = Value("error")

}

在 build.sbt 上,我使用它试图在路由文件中注入(inject)包

  routesImport ++= Seq(
"serviceOrders.models.ServiceStatus"
),

我尝试了很多东西,但都没有成功。我在某个地方读到我可以使用 QueryStringBindable 函数,但是我做的不是很好......你们能帮我解决这个问题吗?

编辑: 顺便说一句,有一种方法可以在不执行此操作的情况下检查状态是否包含在过滤器列表中吗?

.filter {
serviceOrder =>
status.map(serviceOrder.serviceStatus === _)
.reduceOption(_ || _)
.getOrElse(true: Rep[Boolean])
}

这是我能想到的通过从 API 作为查询参数接收的过滤器列表来过滤状态的唯一方法。

最佳答案

您可以像这样实现 QueryStringBindable 实例:

package serviceOrders.models

object ServiceStatus extends Enumeration {

type ServiceStatus = Value

val Pending = Value("pending")
val Started = Value("started")
val Completed = Value("completed")
val Error = Value("error")

implicit val queryStringBindable: QueryStringBindable[ServiceStatus] =
new QueryStringBindable[ServiceStatus] {
override def bind(
key: String,
params: Map[String, Seq[String]]
): Option[Either[String, ServiceStatus]] =
params.get(key).collect {
case Seq(s) =>
ServiceStatus.values.find(_.toString == s).toRight("invalid value")
}

override def unbind(key: String, value: ServiceStatus): String =
implicitly[QueryStringBindable[String]].unbind(key, value.toString)
}
}

在 build.sbt 中你需要这个:

routesImport ++= Seq("serviceOrders.models.ServiceStatus._")

这在你的路由文件中:

GET     /some/route    controllers.SomeController.index(status: ServiceStatus)

然后您可以在 SomeController 中创建一个采用 ServiceStatus 参数的 index 方法,Play 将处理查询参数。

//编辑:您实际上可以使用 QueryStringBindable.Parsing 类来进一步简化实现。

关于scala - 如何使用 Scala 在路由上绑定(bind)枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62886098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com