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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
Form クラスを定義する
リクエストのパラメータをマッピングするための Form クラスを定義します。
package com.example;
public class UserForm {
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 + '\'' +
'}';
}
}
Validator クラスを定義する
バリデーションを行うための Validator を定義します。
- supports メソッドでバリデーションの対象となるクラスを設定します。
- validate メソッドでバリデーション処理を記述します。
ここでは name パラメータがなかった場合にエラーにするバリデータを定義します。
package com.example;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
@Component
public class UserFormValidator implements Validator {
public UserFormValidator() {}
@Override
public boolean supports(Class<?> aClass) {
return UserForm.class.equals(aClass);
}
@Override
public void validate(Object o, Errors errors) {
UserForm userForm = (UserForm) o;
if (userForm.getName() == null) {
errors.rejectValue("name", "name.empty");
}
}
}
Controller で Validator を設定する
Controller では
- Validator を Inject し、
@InitBinder
をつけたメソッドで Validator を追加します。 - ハンドラメソッドの引数で
UserForm
クラスを受け取り、@Validated
をつけます。 UserForm
引数の直後でBindingResult
を受け取ります。
package com.example;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
private final UserFormValidator userFormValidator;
public ExampleController(UserFormValidator userFormValidator) {
this.userFormValidator = userFormValidator;
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addValidators(userFormValidator);
}
@RequestMapping("/")
String postUser(@Validated UserForm userForm, BindingResult errors) {
if (errors.hasErrors()) {
return errors.getFieldError("name").getCode();
}
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.empty