scala - 如何使用 scalapb 在 proto 中描述 Option[FiniteDuration]
问题描述
我正在尝试使用 proto3 和 scalapb,但我无法映射FiniteDuration
也无法将其用作Option
. 任何人都可以请同样的建议
case class Message(id:Int , interval: Option[FiniteDuration])
解决方案
假设您按照安装指南中的说明在 sbt 中配置了 scalabp
您需要为要转换的字段定义自定义类型int64
,默认情况下映射为Long
,FiniteDuration
例如:
syntax="proto3";
import "scalapb/scalapb.proto";
option java_package = "my.app.proto";
message Message {
int32 id = 1;
optional int64 interval = 2 [(scalapb.field).type = "scala.concurrent.duration.FiniteDuration"];
}
这将生成一个看起来您需要的案例类。
ScalaPB 将依赖隐式解析来编译它并应用从Long
to 的映射FiniteDuration
。为此,您需要在生成案例类的同一包中定义一个scalapb.TypeMapper[Long, FiniteDuration]
in ,即.package object
my.app.proto.message
package my.app.proto
import scalapb.TypeMapper
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.FiniteDuration
package object message {
implicit val finiteDuration: TypeMapper[Long, FiniteDuration] =
TypeMapper[Long, FiniteDuration](s => FiniteDuration.apply(s, TimeUnit.MILLISECONDS))(_.toMillis)
}
推荐阅读
- c# - 尝试将 RoleManager 注入 ASP.NET Core 2.2 控制器时出错
- swiftui - SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?
- java - Spring 安全跨域
- java - 获取当前时间并检查时间是否已经过了一段时间
- excel - Powershell 在 Excel 中读取一个选项卡并导出为 CSV
- laravel - 如何在 Laravel+lighthouse graphql 中实现高级验证规则?
- flyway - 在 Quarkus 中打包自定义 Flyway 版本
- javascript - 如何每秒在索引中连续输出每个数字?
- sql - SQL 查询未返回预期结果
- javascript - 纯 JavaScript 防止键盘输入/单击,直到计时器用完