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();
}