与Scala中的Restful服务交互的良好抽象?

时间:2016-04-18 17:31:27

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

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

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

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

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

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

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

  6. 我希望能够定义可应用于String类型的任何字段的通用测试用例,或者应用于标记为Required等的任何字段。

  7. 我最初尝试使用一个简单的case类和Genson来进行序列化和反序列化。这照顾了要求1,2,4和5.但它并没有让我做3或6。

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

2 个答案:

答案 0 :(得分:0)

我不认为3和6应该是json数据绑定lib的一部分。 3的最简单的解决方案是在反序列化对象上挂钩fromJson某种验证。验证可以在案例类的伴随对象内部实现,也可以在案例类实现的一些验证方法中实现,而不需要超级华丽和通用的路径。当然,如果您愿意,可以插入一些通用的库。

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

答案 1 :(得分:0)

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

ToggleButton.OnCheckedChangeListener listener = new ToggleButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton v, boolean isChecked) {
        int index;
        for(index = 0; index < viewIds.length; index++) {
            if (v.getId() == viewIds[index]) {
                getSharedPreferences("PREFS_NAME", MODE_PRIVATE)
                        .edit()
                        .putBoolean(stringIds[index], isChecked)
                        .apply();

                break;
            }
        }
    }
};