Spring、Jersey、Hibernate(JPA)を使用してJavaでRESTWebサービスを構築しています。
現在、リソースに検証のサポートを追加しようとしています。JSR-303(Bean Validation)は当然適切な選択肢として登場しました(私はJSR-303のリファレンス実装であるHibernate Validatorを使用しています)。ただし、最初にいくつかの概念を統合しようとしています。
少なくとも2種類の可能な検証があるように思われます。
- フィールドの定期的な検証。たとえば、プロパティがnullでないことの確認、
String
プロパティが有効な電子メールであるかどうかの確認、Integer
プロパティがより大きいかどうかの確認10
など。これは期待どおりに機能しています。javax.validation.ConstraintViolationException
を適切なHTTP応答にマップするJAX-RSExceptionMapperを登録しました。 - データ整合性の検証
「データ整合性検証」の正確な意味を例を挙げて説明します。これは、2つ以上のリソース間に関係がある場合に発生します。Product
aとaの2つのリソースを想像してみてくださいCategory
。AProduct
にはがありCategory
ます。Product
クライアントが作成するの表現(POST HTTPリクエスト)をサーバーに送信するとき、クライアントCategory
は製品を通知する必要があります。もちろん、クライアントは事前にカテゴリを知っている必要があります。JSONで次のようなものを想像してみてください。
{
"quantity": "10",
"state": "PRODUCED",
"category": {
"id": "123"
}
}
ええと、idのカテゴリ123
は存在しないかもしれません。これをデータベースに挿入しようとすると、明らかに外部キー関連の例外が発生します。したがって、通常のプロパティ検証と同様に、これらの問題を検証し、クライアントに適切なメッセージを返す必要があると思います。
今、私の主な質問は次のとおりです。
- 現在、JPAとBean Validationの統合により、データアクセスレベルで検証を実行しています。検証は、シリアル化プロセスの前/後、データベース操作の前/後、またはその両方で実行する必要がありますか?
- データ整合性検証を処理する方法は?手動で?(つまり、データの整合性をチェックするデータベースを明示的に参照します)または、とにかくそれを挿入してから、データベース(またはDAO)の例外をキャッチする必要がありますか?Bean Validationは、この種の検証とは何の関係もありませんよね?
- JAX-RS / RESTとBeanValidationの経験があれば、教えていただければ幸いです。グループを使用していますか?
これらの質問はJavaにいくらか関連していますが、私はこれらの問題についていくつかの新しい視点を得ることも望んでいました。いくつかの技術に依存しないもの。:)RESTWebサービスでこれらの問題に対する独自のソリューションを提供できれば素晴らしいと思います。