2016-04-18 7 views
1

私はRestfulサービスにやりとりされるデータ構造を表すオブジェクトを作成したいと思います。ScalaのRestfulサービスとやりとりするための良い抽象化?

  1. サービスに記録されているレコードと、Scalaコードで相互作用しているレコードとの間に明白で直接的な関係がなければなりません。 obj.idは、オブジェクトのidフィールドを意味します。

  2. 私は、どのフィールドがレコードを宣言的な方法で構成するかを定義できるようにしたいと考えています。

  3. 各フィールドについて、テーブルの定義と同様に、必須/オプション、一意、データ型、最大長、最小/最大値、デフォルト値などの属性も宣言できるようにしたいSQL

  4. obj.json JSON形式の文字列

  5. TypeCompanionObject.fromJsonとしてシリアル化オブジェクトを返す私は、一般的なテストケースを定義することができるようにしたいJSON文字列

  6. からobjを返します。

  7. など、String型の任意のフィールドに、または必要なマークされている任意のフィールドに

を適用することができ、私は当初、シリアライズとデシリアライズを行うには、単純なケースクラスとGensonを使用してみました。それは要件1,2,4、および5を処理しましたが、実際には3または6にすることはできませんでした。

私のすべての要件を満たす良いパターンは何ですか?

+0

質問がオフトピックですデータバインディングライブラリ内のそれのような何かを見つけることが、オイゲンに同意するだろうと思います。 –

+0

それは良いですか? –

答えて

0

私は3と6がjsonデータバインディングlibの一部であるとは思わない。 3のための最も簡単な解決策は、あなたのfromJsonに、直列化復元されたオブジェクトに対する何らかのバリデーションをフックすることです。検証は、ケースクラスのコンパニオンオブジェクト内で実装することも、ケースクラスによって実装された検証メソッドを実装することもできます。もちろん、必要に応じて汎用ライブラリをプラグインすることもできます。

Gensonで検証を直接行うことができる他のオプションがあります。しかし、これは私には不要です。

+0

私が欲しかったのは、データバインディングのライブラリだったとしたら、私の元のソリューションがうまくいくでしょう。 3と6はサービスの特性を記述するためのものですから、簡単にテストケースを引き出すことができます。たとえば、フィールドが「オプション」であると宣言した場合、フィールドが存在しない場合の動作をテストするテストケースが自動的に生成されます。 「readOnly」とマークした場合、別のテストがフィールドを更新しようとして、更新が失敗したことなどが確認されます。 –

+0

基本的には、共通の/再利用可能なテストケースを定義し、クラス(またはそのコンパニオンオブジェクト)に簡単に注釈を付けることで、どの標準テストを適用するかを示す簡潔で宣言的な方法があります。 –

+0

これを行うより良い方法があれば、私は提案が大好きです。 –

0

フィールドにカスタムアノテーションを追加することで3に到達しようとする可能性があります。私は確かに分かりませんが、jsonシリアライザ/デシライザがこれらのアノテーションを選択できるという確信がありますので、実行時にチェックすることができます。私は与えられたアプローチのいくつかのバリエーションが6を解決するために、あなたを助けるかもしれないと私はあなたがサードパーティのライブラリを求め

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