Menu Close
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; // ... }
戻り値の検証 (Response 以外)
通常のメソッドの戻り値 (Response 以外) に検証を適用するには、メソッド署名の前にアノテーションを追加します。たとえば、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 ); }
戻り値の検証 (Response)
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(); }