【问题标题】:Good abstraction for interacting with a Restful service in Scala?在 Scala 中与 Restful 服务交互的良好抽象?
【发布时间】:2016-04-18 17:31:27
【问题描述】:

我想创建表示来回传递给 Restful 服务的数据结构的对象。

  1. 服务中记录的记录与 Scala 代码中与之交互的记录之间必须存在明显且直接的关系,例如obj.id 表示对象的id 字段。

  2. 我希望能够以声明的方式定义构成记录的字段。

  3. 对于每个字段,我还希望能够声明必需/可选、唯一、数据类型、最大长度、最小/最大值、默认值等属性,就像定义SQL中的表

  4. obj.json返回序列化为JSON格式字符串的对象

  5. TypeCompanionObject.fromJson 从 JSON 字符串返回 obj

  6. 我希望能够定义通用测试用例,这些测试用例可以应用于任何字符串类型的字段,或任何标记为必需的字段等。

我最初尝试使用一个简单的案例类和 Genson 来进行序列化和反序列化。这满足了要求 1、2、4 和 5。但它并没有真正让我做 3 或 6。

有什么好的模式可以满足我的所有要求?

【问题讨论】:

  • 询问第三方库的问题是题外话。

标签: scala rest database-schema dsl case-class


【解决方案1】:

我认为 3 和 6 不应该是 json 数据绑定库的一部分。 3 最简单​​的解决方案是在您的 fromJson 中对反序列化对象进行某种验证。验证可以在您的案例类的伴随对象内或在案例类实现的某些验证方法中实现,而无需走超级花哨和通用的路线。当然,如果您愿意,也可以在其中插入一些通用库。

还有其他选项可以直接插入 Genson 中的验证。但这对我来说听起来没有必要。

【讨论】:

  • 如果我想要的只是一个用于数据绑定的库,那么我最初的解决方案就可以了。 3 和 6 用于描述服务的特性,因此我可以轻松地引入测试用例。例如,如果我声明一个字段是“可选的”,那么会自动生成一个测试用例来测试如果该字段不存在会发生什么。如果我将其标记为“只读”,则另一个测试会尝试更新该字段并验证更新是否失败,依此类推。
  • 基本上,我会定义一堆常见/可重用的测试用例,然后通过简单地注释类(或其伴生对象),有一种简洁和声明性的方式来指示哪些标准测试申请。
  • 如果有更好的方法,我很乐意提出建议。
  • 我了解,但我不知道有哪个库可以在 scala 中为您完成所有这些工作。最接近的验证是 java bean 验证,但它不能很好地与 scala 一起使用。我的观点是,由于您已经在 deser 之上添加了一个抽象层,因此您可以在其中插入您的验证系统。如果您决定使用注解,Genson 可以向您公开这些注解,但是您将不得不使用 Genson 的一些更高级的 API。
  • 我不是一定要找图书馆。我正在寻找有关如何编写满足我所有要求的代码的想法。
【解决方案2】:

我可以通过向字段添加一些自定义注释来尝试达到 3。我不确定,但我有信心 json 序列化器/desiralizers 应该能够选择这些注释,因此您将能够在运行时检查它们。我认为给定方法的一些变化可能会帮助您解决 6。我同意 eugen 的观点,您可能会在数据绑定库中找到类似的东西

case class Person(
  @Required name: @Required String, age: Int, @Optional gender: Gender
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多