@ModelAttribute
を使うとフォームのパラメータをオブジェクトにマッピングすることができます。
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 + '\'' +
'}';
}
}
Controller で Validator を設定する
Controller ではハンドラメソッドの引数に UserForm を指定します。
package com.example;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@RequestMapping("/")
String postUser(@ModelAttribute UserForm userForm) {
return userForm.toString();
}
}
このコードは @ModelAttribute
はつけなくても動作します。
ハンドラメソッドの引数に、フレームワーク側がサポートしていないクラスがあると自動的に @RequestParam
または @ModelAttribute
とみなされるためです。
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);
}
}
動作確認
$ curl -X POST http://localhost:8080 -d name=John
User{name='John'}