Spring MVC では Hibernate Validator を依存ライブラリとして追加していれば Bean Validation によるバリデーションが有効になります。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
</dependencies>
</project>
Form クラスを定義する
リクエストのパラメータをマッピングするための Form クラスを定義します。
name パラメータが空の場合にエラーにしたいので、@NotBlank
アノテーションをつけました。
package com.example;
import javax.validation.constraints.NotBlank;
public class UserForm {
@NotBlank(message = "name is blank")
private String name;
public UserForm() {
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
Controller
Controller では
- ハンドラメソッドの引数で
UserForm
クラスを受け取り、@Validated
をつけます。 UserForm
引数の直後でBindingResult
を受け取ります。
package com.example;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@RequestMapping("/")
String postUser(@Validated UserForm userForm, BindingResult errors) {
if (errors.hasErrors()) {
return errors.getFieldError("name").getDefaultMessage();
}
return userForm.toString();
}
}
main メソッド
Spring Boot アプリケーションとして起動します。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Example {
public static void main(String[] args) {
SpringApplication.run(Example.class, args);
}
}
動作確認
name パラメータがない場合にエラーとなることが確認できます。
$ curl -X POST http://localhost:8080 -d name=John
User{name='John'}
$ curl -X POST http://localhost:8080
name is blank