JAX-RSリソースでJSR303(Bean Validation)アノテーションを有効活用できないか?
たとえば、@NotEmpty アノテーションを付けたリソース メンバーがある場合、この制約が満たされない場合、クライアントにエラーを生成しますか?
これは当然のことのように思えますが、より良い方法を教えてもらえるとうれしいです (検証を ORM/データベース レベルにまで下げたくありません)。
JAX-RSリソースでJSR303(Bean Validation)アノテーションを有効活用できないか?
たとえば、@NotEmpty アノテーションを付けたリソース メンバーがある場合、この制約が満たされない場合、クライアントにエラーを生成しますか?
これは当然のことのように思えますが、より良い方法を教えてもらえるとうれしいです (検証を ORM/データベース レベルにまで下げたくありません)。
本当にリソース メンバーを検証するつもりですか? 通常、リソース メンバーはこの方法または別の方法 (コンテキスト、エンティティ、またはパス/クエリ/マトリックス パラメータのいずれか) で挿入されますが、JAX-RS フレームワークが機能している限り、これらのメンバーは適切に挿入されます。
個人的には、エンティティが電信で到着し、MessageBodyReader で満たされているため、エンティティを検証する方が理にかなっていると思います。
そのため、エンティティを検証することにした場合は、いくつかの方法があります。
私の知る限り、Apache Wink は組み込みの検証をサポートしていません。ハンドラを実装できます。を参照してくださいDeploymentConfiguration.initRequestHandlersChain()
。ユーザー ハンドラーの追加をサポートしています。ハンドラーでは、任意の検証を実行できます。あなたがこのコードを提供してくれると、Wink コミュニティも喜ぶと思います。
このアプローチの唯一の問題は、Apache Wink にバインドされていることです。別の JAX-RS フレームワークに移行することにした場合、それは機能しません。
別のアプローチは、この検証を独自の で行うことMessageBodyReader
です。必要なのは、エンティティ用の特別なリーダーを登録し、内部のエンティティを検証することだけです。を使用して、標準の MessageBodyReaders (JAXB や Jackson など) を引き続き利用できます@Context Providers.getMessageBodyReader()
。このアプローチの良いところは、標準の JAX-RS であることです。設計されていないものに MessageBodyReaders を使用するのは悪いことです。
最も簡単な方法は、各リソース メソッドの最初の行でエンティティを検証することです。コードの重複が発生することもありますが、シンプルさが勝る場合もあります。
1 つの解決策 - 私は Spring 2.5.x を使用しているので、InitializingBean を実装し、Hibernate のバリデーターに委譲するラッパー クラスを作成できます。それは動作します - より良い解決策はありますか?