3

データモデルとビジネスレイヤーが 2 つの異なるモジュールにあるプロジェクトがあります。もちろん、ビジネスモジュールはモデルモジュールに依存しています。エンティティー検証は、java-validation-api アノテーションによって実装されます。

cross-entity-validation (異なるエンティティ タイプ間の関係が検証されるビジネス検証) をどこに実装すればよいのか疑問に思っています。現在、次のオプションが表示されます。

  1. カスタム javax.validation.ConstraintValidators および関連する注釈を作成します。問題は、バリデータがビジネス サービスにアクセスする必要があることです。つまり、関連するエンティティを取得する必要がありますが、モデル モジュールはビジネス モジュールに依存するべきではありません。
  2. ビジネス サービスの永続化/マージ メソッドにクロス エンティティ検証を実装します (つまり、インターセプターを使用します)。それは可能ですが、クロスエンティティ検証はエンティティ検証から分離されているため、検証する場所は1つだけにしたいと思います。

どのオプションが望ましいですか? より良い提案はありますか?

ありがとう、セバスチャン

4

1 に答える 1

1

イデオロギーの観点からは、アプローチ 1. の方が優れています。Bean Validation はモデルのレベル (Model-View-Controller 内) で機能しており、Model 部分がデータベースと通信しても問題ありません。したがって、たとえば、コードの重複を避けるために、サービスリーダーとモデルバリデーターの両方で使用できる DAO を作成できます。

インターセプターも何かを検証するのに適した場所ですが、Bean Validation の全機能と自動性を利用することはできません。おそらく、モデル オブジェクトに対して手動で validate メソッドを呼び出したり、必要に応じて ConstraintViolationException をスローしたりする必要があります。実行可能ですが、少し手間がかかります。さらに、いくつかの検証はおそらくモデルに残されるため、指摘したように、検証が行われている場所は複数あります。

したがって、必要な DB コードを別のレイヤーに移動し、オプション 1 を使用します。

于 2012-04-23T12:31:35.003 に答える