5

JAX-RSリソースでJSR303(Bean Validation)アノテーションを有効活用できないか?

たとえば、@NotEmpty アノテーションを付けたリソース メンバーがある場合、この制約が満たされない場合、クライアントにエラーを生成しますか?

これは当然のことのように思えますが、より良い方法を教えてもらえるとうれしいです (検証を ORM/データベース レベルにまで下げたくありません)。

4

2 に答える 2

3

本当にリソース メンバーを検証するつもりですか? 通常、リソース メンバーはこの方法または別の方法 (コンテキスト、エンティティ、またはパス/クエリ/マトリックス パラメータのいずれか) で挿入されますが、JAX-RS フレームワークが機能している限り、これらのメンバーは適切に挿入されます。

個人的には、エンティティが電信で到着し、MessageBodyReader で満たされているため、エンティティを検証する方が理にかなっていると思います。

そのため、エンティティを検証することにした場合は、いくつかの方法があります。

  1. 私の知る限り、Apache Wink は組み込みの検証をサポートしていません。ハンドラを実装できます。を参照してくださいDeploymentConfiguration.initRequestHandlersChain()。ユーザー ハンドラーの追加をサポートしています。ハンドラーでは、任意の検証を実行できます。あなたがこのコードを提供してくれると、Wink コミュニティも喜ぶと思います。
    このアプローチの唯一の問題は、Apache Wink にバインドされていることです。別の JAX-RS フレームワークに移行することにした場合、それは機能しません。

  2. 別のアプローチは、この検証を独自の で行うことMessageBodyReaderです。必要なのは、エンティティ用の特別なリーダーを登録し、内部のエンティティを検証することだけです。を使用して、標準の MessageBodyReaders (JAXB や Jackson など) を引き続き利用できます@Context Providers.getMessageBodyReader()。このアプローチの良いところは、標準の JAX-RS であることです。設計されていないものに MessageBodyReaders を使用するのは悪いことです。

  3. 最も簡単な方法は、各リソース メソッドの最初の行でエンティティを検証することです。コードの重複が発生することもありますが、シンプルさが勝る場合もあります。

于 2012-02-28T16:01:34.767 に答える
1

1 つの解決策 - 私は Spring 2.5.x を使用しているので、InitializingBean を実装し、Hibernate のバリデーターに委譲するラッパー クラスを作成できます。それは動作します - より良い解決策はありますか?

于 2012-02-28T16:01:48.927 に答える