1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
コース一覧
Spring Boot入門
@PostMappingとリクエストボディ

Spring Boot入門

Java で Web API サーバーを作るための Spring Boot の入門コースです。DI コンテナ、REST コントローラ、リクエスト検証、レイヤ分割、Spring Data JPA、例外ハンドリング、テストまでを扱います。毎レッスン、Spring が裏側でやっている判断そのものを pure Java の関数として自分で書き、フレームワークが何を肩代わりしてくれているのかを手触りで理解できる構成にしました。約 12 時間 (1 日 30 分 × 24 日) で 48 レッスンを修了できます。

1
Spring Bootとは何か
01. Spring Bootで何が作れるのか10分
02. サーブレットからフレームワークへ15分
03. ルーティング表という発想15分
04. プロジェクトの構成10分
05. 起動のしくみと自動設定15分
06. パスのマッチング15分
2
DIコンテナ
01. newで書くと何が困るのか15分
02. コンストラクタインジェクション15分
03. インターフェースへの依存15分
04. @Componentと@Bean15分
05. 自作のDIコンテナ20分
06. Beanのスコープとライフサイクル15分
3
RESTコントローラ
01. RESTという設計方針15分
02. @RestControllerの役割15分
03. @GetMappingとパス変数15分
04. クエリパラメータの受け取り15分
05. @PostMappingとリクエストボディ15分
06. ステータスコードの選び方15分
07. ResponseEntityで組み立てる15分
4
リクエストとレスポンスの変換
01. JSONとオブジェクトの往復15分
02. DTOとエンティティを分ける15分
03. recordでDTOを書く15分
04. 入力検証の基本15分
05. 検証エラーをまとめて返す15分
06. アノテーションによる検証15分
5
レイヤ構成とビジネスロジック
01. 3層アーキテクチャ10分
02. @Serviceに置くもの15分
03. 状態遷移をルールにする15分
04. 料金計算のような業務ロジック15分
05. @Transactionalとは何か15分
06. トランザクションの巻き戻し15分
6
データアクセス
01. @Entityとテーブルの対応15分
02. リポジトリという抽象15分
03. メソッド名からクエリを作る20分
04. 検索条件の組み立て15分
05. ページングと並び替え15分
06. N+1問題15分
7
例外処理と横断的関心事
01. 例外をHTTPに変換する15分
02. @ExceptionHandlerと@ControllerAdvice15分
03. エラーレスポンスの形を決める15分
04. フィルタとインターセプタ15分
05. ログとリクエストの追跡15分
06. 設定値の外部化15分
8
テストと仕上げ
01. テストの種類と使い分け15分
02. Serviceの単体テスト15分
03. モックで依存を差し替える15分
04. MockMvcでエンドポイントを試す15分
05. 本番へ出すための次の一歩10分

@PostMappingとリクエストボディ

このレッスンでは、@PostMapping と @RequestBody を使って、新しいリソースを作るエンドポイントを設計できるようになります。

POST は集合に対する操作

GET / PUT / DELETE が 1 件を指すのに対し、POST だけは集合に向けて送ります。

プレーンテキスト

POST /users

/users/12 ではなく /users に送るのは、まだ ID が決まっていないからです。「この集合に、こういう内容の要素を 1 つ追加してほしい」という依頼が POST です。ID を決めるのはサーバーの仕事で、決まった ID はレスポンスで教えます。

@RequestBody で本文を受け取る

GET と違い、POST はリクエスト本文を持ちます。JSON で送られてきた本文をオブジェクトに変換して受け取るのが @RequestBody です。

Java

@RestController @RequestMapping("/users") public class UserController { @PostMapping public UserResponse create(@RequestBody CreateUserRequest request) { User saved = service.create(request.name(), request.email()); return UserResponse.from(saved); } }

{"name":"sato","email":"sato@example.com"} という本文が送られてくると、Jackson が CreateUserRequest のプロパティに値を詰めてくれます。この変換は @ResponseBody の逆向きの処理で、同じ HttpMessageConverter の仕組みが担当します。

@RequestParam との違い

アノテーション読む場所主な用途
@PathVariableURL のパスどのリソースかの指定
@RequestParamクエリ文字列 または フォーム絞り込み・簡単な値
@RequestBodyリクエスト本文構造のあるデータの送信

新規作成のように項目が多く入れ子もあるデータは、本文で送るのが自然です。クエリ文字列に長い JSON を詰めるようなことはしません。

送られてきた内容は必ず疑う

ここが最も大事な点です。リクエスト本文はクライアントが自由に作れるので、名前が空だったり、メールの形式が壊れていたり、そもそもキーが無かったりします。変換に成功したことと、業務上正しいことは別です。

Spring では Bean Validation と @Valid を組み合わせて検証を宣言的に書けます。

Java

public record CreateUserRequest( @NotBlank String name, @NotBlank @Email String email) { } @PostMapping public UserResponse create(@Valid @RequestBody CreateUserRequest request) { ... }

@Valid を付けると、メソッドの中身に入る前に検証が走り、違反があればハンドラは呼ばれずに 400 が返ります。検証の詳細は後のセクションで扱いますが、まずは「本文を受け取ったら必ず検証してから使う」という順番を身につけてください。

作成に成功したときに返すもの

作成が成功したら、次の 3 つを返すのが定石です。

  1. ステータスコード 201
  2. 作られたリソースの場所を示す Location ヘッダ
  3. 本文として、採番された ID を含む作成結果

クライアントは ID を知らずに POST しているので、ID を返してあげないと次の操作ができません。この組み立て方は、このセクションの最後のレッスンで扱います。

演習で確かめます

Spring では @RequestBody が JSON をオブジェクトに変換し、@Valid が入力の検証を引き受けます。ここではその両方を自分で書きます。名前とメールを受け取り、名前が空でなければ採番した ID を付けた作成結果を返し、名前が空なら invalid を返す関数を作ってください。

要件

  1. name が null または空白のみなら invalid を返すこと
  2. name の前後の空白は取り除いてから使うこと
  3. 妥当な場合は id=13,name=sato,email=sato@example.com の形で返し、id は currentCount + 1 とすること

入出力例

createUser("sato", "sato@example.com", 12) → "id=13,name=sato,email=sato@example.com" createUser(" taro ", "taro@example.com", 0) → "id=1,name=taro,email=taro@example.com" createUser("", "a@example.com", 5) → "invalid" createUser(" ", "a@example.com", 5) → "invalid" createUser("hanako", "hanako@example.com", 99) → "id=100,name=hanako,email=hanako@example.com"

ヒント

空白のみかどうかは trim した結果が空文字列かどうかで判定できます。null チェックを先に行ってください

@NotBlank が弾くのは null と空文字列と空白のみの 3 つです。同じ判定を自分で書きます

戻り値は "id=" + id + ",name=" + name + ",email=" + email の形で組み立てます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • ステータスコードの選び方

    操作と結果から適切なステータスコードを決められるようになります。

  • ResponseEntityで組み立てる

    本文とステータスとヘッダを一体で返す形を実装します。

  • JSONとオブジェクトの往復

    キーと値の対応づけを自分で実装し、変換の中身を掴みます。

  • 3層アーキテクチャ

    層を分ける理由と、それぞれの責務を説明できるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • 設計何をどう作るかを決める前工程
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • applicationJSON 本文を送るときの Content-Type
  • オブジェクトキーと値のペアで構造を作るデータ
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • 処理計算や代入を表す長方形
main.java
学習モード
エディタを読み込んでいます

メモ

@PostMappingとリクエストボディ

⌘S で保存