6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Spring Bootの@ModelAttributeと@RequestBodyの違い

Last updated at Posted at 2023-06-10

この記事では、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におけるリクエストデータの取り扱いがより簡単になります。適切なアノテーションを使用して、あなたのアプリケーションのコードをより効率的に管理することができます。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?