65.2. Bean Validation を使用したサービスの開発
65.2.1. サービス Bean のアノテーション
概要
Bean 検証でサービスを開発する最初のステップは、関連する検証アノテーションをサービスを表す Java クラスまたはインターフェイスに適用することです。検証アノテーションを使用すると、メソッドパラメーター、戻り値、およびクラスフィールドに制約を適用でき、サービスが呼び出されるたびに、実行時にチェックされます。
単純な入力パラメーターの検証
パラメーターが簡単な Java 型である場合にサービスメソッドのパラメーターを検証するには、Bean バリデーション API (javax.validation.constraints
パッケージ) から制約アノテーションを適用できます。たとえば、以下のコード例は、nullness (@NotNull
アノテーション) の両方のパラメーターをテストし、id
文字列が \\d+
正規表現 (@Pattern
アノテーション) と一致するかどうか、および name
文字列の長さが 1 から 50 の範囲にあるかどうかをテストします。
import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; ... @POST @Path("/books") public Response addBook( @NotNull @Pattern(regexp = "\\d+") @FormParam("id") String id, @NotNull @Size(min = 1, max = 50) @FormParam("name") String name) { // do some work return Response.created().build(); }
複雑な入力パラメーターの検証
複雑な入力パラメーター (オブジェクトインスタンス) を検証するには、以下の例のように @Valid
アノテーションをパラメーターに適用します。
import javax.validation.Valid; ... @POST @Path("/books") public Response addBook( @Valid Book book ) { // do some work return Response.created().build(); }
@Valid
アノテーションは、単独では制約を指定しません。Book パラメーターに @Valid
のアノテーションを付けると、検証制約を探すために (再帰的に) Book
クラスの定義内を調べるように、検証エンジンを効果的に指示します。この例では、以下のように、Book
クラスは id
および name
フィールドの検証制約で定義されます。
import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; ... public class Book { @NotNull @Pattern(regexp = "\\d+") private String id; @NotNull @Size(min = 1, max = 50) private String name; // ... }
戻り値の検証 (応答以外)
通常のメソッドの戻り値 (応答以外) に検証を適用するには、メソッド署名の前にアノテーションを追加します。たとえば、nullness (@NotNull
アノテーション) の戻り値をテストし、検証の制約を再帰的にテストするには (@Valid
アノテーション)、以下のように getBook
メソッドにアノテーションを付けます。
import javax.validation.constraints.NotNull; import javax.validation.Valid; ... @GET @Path("/books/{bookId}") @Override @NotNull @Valid public Book getBook(@PathParam("bookId") String id) { return new Book( id ); }
戻り値 (応答) の検証
javax.ws.rs.core.Response
オブジェクトを返すメソッドに検証を適用するには、Response 以外のケースと同じアノテーションを使用できます。以下に例を示します。
import javax.validation.constraints.NotNull; import javax.validation.Valid; import javax.ws.rs.core.Response; ... @GET @Path("/books/{bookId}") @Valid @NotNull public Response getBookResponse(@PathParam("bookId") String id) { return Response.ok( new Book( id ) ).build(); }