2017-08-16 6 views
6

バリデーションを処理する最良の方法は、Kotlinデータクラスを使用してバリューオブジェクトをモデリングする場合です。最初のコンストラクタの後に実行されるので、initブロックが唯一の論理的な場所であるようです。 JSR-303例バリデーションデータクラスのパラメータKotlin

これの欠点は、それであるを使用して

data class EmailAddress(val address: String) { 

    init { 
     if (address.isEmpty() || !address.matches(Regex("^[a-zA-Z0-9][email protected][a-zA-Z0-9]+(.[a-zA-Z]{2,})$"))) { 
      throw IllegalArgumentException("${address} is not a valid email address") 
     } 
    } 
} 

はその検証がデータクラスの責任ではないよう

@Configurable 
data class EmailAddress(@Email val address: String) { 

    @Autowired 
    lateinit var validator: Validator 

    init { 
     validator.validate(this) 
    } 
} 
+0

私はいつもあなたの最初の例と同様に何かをやったが、私はちょうど、明示的な 'validate'方法を入れて、それをコントローラから呼び出す(例えば、私がSから実装された要求オブジェクトを持っている場合'@ RequestBody'として起動し、入力を検証したいと思います。 – Kevin

答えて

0

は実際に、それが見える織りロード時間を要します。 dataはそれ自身のことを指示します。データの格納に使用されます。あなたがデータクラスを検証したい場合

  1. だから、それは完璧な感覚は、コンストラクタの引数に@get:検証を設定し、建設を担当し、クラス内のデータクラスの外を検証するようになります。

  2. あなたの目のオプションは、ちょうどあなたが春のフレームワークを使用した場合も、単純なクラスを使用して、そこ

  3. をバリデータを渡すコンストラクタで全体のロジックを実装し、データクラスを使用することではありません - あなたはプロトタイプで、このクラス豆を作ることができますスコープが、チャンスは、スパゲッティコードのような種類で動作するように絶対的に不快になります:)