私たちのホームプロジェクトの多くのドメインオブジェクトはフィールドの検証が必要で、この目的のためにcommons-langを使用しています。たとえば:DDDオブジェクトのJSR 303 Bean検証とマニュアル(Apache Commons経由)を混在させる
public class Position {
private static final int LATITUDE_AMPLITUDE = 90;
private static final int LONGITUDE_AMPLITUDE = 180;
private Float latitude;
private Float longitude;
public Position(float latitude, float longitude) {
Validate.inclusiveBetween(-LATITUDE_AMPLITUDE, LATITUDE_AMPLITUDE, latitude,
"Latitude must be +- " + LATITUDE_AMPLITUDE);
Validate.inclusiveBetween(-LONGITUDE_AMPLITUDE, LONGITUDE_AMPLITUDE, longitude,
"Longtitude must be +- " + LATITUDE_AMPLITUDE);
this.latitude = latitude;
this.longitude = longitude;
}
}
我々はそれを結合ドメインは、インフラストラクチャとオブジェクトおよび検証を起動します外部からの介入を必要とするため、JSR 303を使用しないことを決めました。
しかし、RESTエンドポイントの実装を開始したとき、jsonコンバーターはクラスコンストラクターを使用せず、Reflectionを介して値を注入するため、検証の問題に直面しました。
JSR303とJerseyの@Valid
アノテーションを使用してオブジェクトを検証するのは非常に簡単ですが、JSR303でドメインオブジェクトに注釈を付ける必要があります。
- JSR303検証のみを使用してください。 Imho、それは悪い選択です。これらのオブジェクトで動作するビジネスレイヤーには、JSR303検証トリガーという複雑な(より複雑なものはありません))のない検証されたオブジェクトも必要です。
- JSR303 +手動検証を使用してください。アプリケーション層とビジネス層の両方を満足させますが、JSR303の依存関係とアノテーションのためにドメインオブジェクトを太ってしまいます。
あなたはこれについてどう思いますか? JSR303とマニュアルバリデーションの両方を混ぜるのは良い方法ですか?
JSR303の非表示のコンテキストで注釈付きのJSR303 'Position'クラスを使用する場合はどうすればよいですか?たとえば、ドメインサービスでは、SpringやJerseyについてはわかりません。 JSR303では、検証を手動で実行しない限り、0になります。 – ovnia
SpringやJerseyを使わずに 'Validator'インスタンスを作成し、エンティティを検証するのはとても簡単です。必要なコードの例については、Hibernate ValidatorのGetting Startedセクションを参照してください(それほど多くありません):http://hibernate.org/validator/documentation/getting-started/ – ck1
したがって、 'Validation.buildDefaultValidatorFactory )新しいポジション(1L、2L)の代わりに.getValidator()。validate(新しいポジション(1L、2L)); – ovnia