scala - 使用 Shapeless 进行域类和灵活生成的案例类转换

标签 scala slick shapeless

Slick codegen 生成一个方便的 Tables.scala,其中包含行和表的所有类。我们喜欢这种方法,因为我们可以使用关系设计并充分利用我们选择的 SQL 方言的全部功能。

但是,出于以下原因,我们正在编写大量样板代码以从 REST API 模型/域 API 模型转换为光滑的 XYZ 行:

  1. 与域案例类相比,Slick 案例类中还有更多参数(这些附加参数例如从 REST 资源的路径中提取)
  2. 我们不想向其他层/微服务公开路径依赖类型。他们只需要了解 REST API 模型
  3. 我们通常将日期和时间类从 java.sql 转换为等效的 java.time

我们能否自动化转换,这样我们就不必每次都显式地编写两个转换函数,从领域模型到光滑的案例类,反之亦然。特别是:

  1. 如何编写一个通用函数,在具有相同 HLIST 表示形式的两个等效案例类之间提供隐式转换?

  2. 我们如何在具有不同 HLIST 表示的两个案例类之间编写通用隐式转换,为不同成员提供一组范围内的隐式转换(java.sql.Timestamp -> java.time.ZonedDateTime)

  3. 我们如何编写一个函数来在两个案例类之间进行转换,其中输出一个具有 Repr = HList1::HList2,第一个具有 Repr = HList2(即,我们如何在 HList2 前面添加/附加从请求中提取的参数?)

最佳答案

有一些库可以执行此操作,您可以使用它们或阅读源代码来学习。例如https://index.scala-lang.org/davegurnell/bulletin/bulletin/0.7.0

关于scala - 使用 Shapeless 进行域类和灵活生成的案例类转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43155440/

相关文章:

scala - 如何删除每组计数低于阈值的记录?

scala - 在Slick 3.0中,为什么新引入的 `Streaming`有用?

java - 弗林克 : Wrap executable non-flink jar to run it in a flink cluster

scala - playframework 禁用 CSRF 过滤器

scala - 将自定义谓词传递给 TableQuery 的过滤方法

scala - 如何在编译时使用 shapeless 将 case 类字段的名称作为字符串/符号获取?

scala - 通过鉴别器使用嵌套的 Coproduct 解码 Case 类

scala - 反转 HList 并转换为类?

java - 使用 SimpleDateFormat 获取 UTC 日期

postgresql - 具有多个 PK insertOrUpdate() 的 Scala 的 Slick 抛出异常 ERROR : syntax error at end of input