Web系開発メモ

Java, JavaScript, CSS, HTML など、Webアプリの記事を中心に書いています。

SpringBoot入門:バリデーションをする

Spring Boot の Webアプリで、バリデーション(入力値検証)をする方法を書いていきます。バリデーションには、javax.validation や Hibernate Validator のアノテーションを使います。

前提

この記事は、入門記事「JSONの返却」の資源(ビルドファイル、クラス等)を利用しています。必要に応じて参照して頂けると嬉しいです。

手順1. コントローラの作成

リクエストの JSON をメソッド引数のオブジェクトにバインドして、その値をバリデートするコントローラを作成します。

gssb/src/main/java/gssb/controller/ValidationController.java

package gssb.controller;

import javax.validation.Valid;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValidationController {

  @RequestMapping(value="/address", method=RequestMethod.POST)
  public Address create(@Valid @RequestBody Address address) {
    return address;
  }
  
  public static class Address {
    
    @NotEmpty
    @Size(min=7, max=7)
    public String zip;
    
    @NotEmpty
    public String address;
  }
}

メソッド引数のオブジェクトに @Valid を付けるとバリデーションが実行されるようです。どのバリデーションをするかは、オブジェクトのコードに定義します。上の例だと、Address クラスの @NotEmpty@Size がバリデーションの定義になります。

手順2. 起動

次のコマンドでアプリを起動します。

gssb > gradle bootRun

手順4. 確認

手順 4.1. 正常系

入力値(リクエストの JSON)に問題がない場合、コントローラは入力値をそのまま返します。

確認コマンド(※ JSON 内のエスケープ文字「\」は Windows で必要)

curl http://localhost:8080/address -H "Content-Type: application/json" -d "{\"zip\":\"1234567\", \"address\":\"Japan\"}" -X POST

結果

{"zip":"1234567","address":"Japan"}

手順 4.2. バリデーションエラー

「zip を 6桁」「address を空文字」にして、リクエストを送ってみます。

確認コマンド(※ JSON 内のエスケープ文字「\」は Windows で必要)

curl http://localhost:8080/address -H "Content-Type: application/json" -d "{\"zip\":\"123456\", \"address\":\"\"}" -X POST

結果

{"timestamp":1469434038414,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.MethodArgumentNotValidException","errors":[{"codes":["NotEmpty.address.address","NotEmpty.address","NotEmpty"],"arguments":[{"codes":["address.address","address"],"arguments":null,"defaultMessage":"address","code":"address"}],"defaultMessage":"may not be empty","objectName":"address","field":"address","rejectedValue":"","bindingFailure":false,"code":"NotEmpty"},{"codes":["Size.address.zip","Size.zip","Size"],"arguments":[{"codes":["address.zip","zip"],"arguments":null,"defaultMessage":"zip","code":"zip"},7,7],"defaultMessage":"size must be between 7 and 7","objectName":"address","field":"zip","rejectedValue":"123456","bindingFailure":false,"code":"Size"}],"message":"Validation failed for object='address'. Errorcount: 2","path":"/address"}

正常系とは違う JSON が返ってきました。よく見ると、エラーは2つ(Errorcount: 2)で、zip(size must be between 7 and 7)と address(may not be empty)のエラー情報が確認できます。

今回は、バリデーションをしてエラーが発生するところまで書きました。エラーハンドリングの方法などは、別の記事で書いていこうと思います。