この記事では、Spring Boot(具体的にはSpring MVC)で使用される@ModelAttribute
と@RequestBody
のアノテーションの違いについて解説します。これらはHTTPリクエストからデータを取得するためのアノテーションですが、その使用されるHTTPメソッドと取り扱うデータの種類に違いがあります。
@ModelAttribute
@ModelAttribute
は一般的にHTTPのGETメソッドで使用されますが、POSTメソッドでも使用可能です。このアノテーションはリクエストパラメータを直接ビューに渡すことを目的としています。これは一般的にフォームデータの送信に使用されます。@ModelAttribute
を使用すると、リクエストパラメータは直接コマンドオブジェクト(一般的にはJavaBeansやデータクラス)にバインドされます。バインドされるパラメータは通常、クエリストリングやフォームデータに含まれています。
@RequestBody
一方、@RequestBody
は主にHTTPのPOSTやPUTメソッドで使用されます。リクエストの本文(body)を使用して、Java/Kotlinオブジェクトにデータをバインドします。このアノテーションは一般的にJSONやXMLのようなメッセージボディを使用してデータを送信する際に使用されます。
使用例
それぞれの使用例を以下に示します。
Kotlin側の例:
import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("/api")
class MyController {
// @ModelAttribute の使用例(POSTメソッドでの使用)
@PostMapping("/attr")
fun handleAttribute(@ModelAttribute user: User): String {
return "Received POST request, user name is ${user.name}"
}
// @RequestBody の使用例
@PostMapping("/body")
fun handleBody(@RequestBody user: User): String {
return "Received POST request, user name is ${user.name}"
}
}
// データクラスの例
data class User(var name: String = "")
Javascript側の例:
// @ModelAttribute の使用例(POSTメソッドでの使用)
fetch('/api/attr', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
name: 'John'
})
}).then(response => response.text())
.then(data => console.log(data));
// @RequestBody の使用例
fetch('/api/body', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'John' })
}).then(response => response.text())
.then(data => console.log(data));
上記の例では、@ModelAttribute
はPOSTリクエストで使用され、Content-Type
ヘッダーがapplication/x-www-form-urlencoded
と設定されています。ここで、POSTリクエストのボディにname=John
という形式のデータが含まれており、このデータがUserオブジェクトにバインドされます。一方、@RequestBody
の例では、JSON形式のデータをPOSTリクエストのボディからUserオブジェクトにバインドします。
これらの違いを理解することで、Spring Bootにおけるリクエストデータの取り扱いがより簡単になります。適切なアノテーションを使用して、あなたのアプリケーションのコードをより効率的に管理することができます。