1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
コース一覧
Spring Boot入門
ResponseEntityで組み立てる

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分

ResponseEntityで組み立てる

このレッスンでは、ResponseEntity を使って本文とステータスコードとヘッダを一体で組み立てられるようになります。

戻り値だけでは足りない場面がある

これまでのコントローラは、本文になるオブジェクトをそのまま返していました。

Java

@GetMapping("/{id}") public UserResponse get(@PathVariable Long id) { return service.find(id); }

この書き方は簡潔ですが、返せるのは本文だけです。ステータスコードは 200 に固定され、ヘッダを足すこともできません。@ResponseStatus を付ければコードは変えられますが、それも固定値です。

実際には「見つかれば 200 で本文、見つからなければ 404 で本文なし」のように、同じメソッドの中で状況に応じてコードを変えたいことがあります。そのための型が ResponseEntity です。

本文とコードとヘッダを 1 つにまとめる

Java

@GetMapping("/{id}") public ResponseEntity<UserResponse> get(@PathVariable Long id) { return service.find(id) .map(ResponseEntity::ok) .orElseGet(() -> ResponseEntity.notFound().build()); }

ResponseEntity.ok(body) は 200 と本文、ResponseEntity.notFound().build() は 404 で本文なしを表します。ジェネリクスの型引数は本文の型です。

組み立て方は 2 通りあります。

Java

// 手軽な形 ResponseEntity.ok(user); ResponseEntity.status(HttpStatus.CONFLICT).body(errorBody); // 段階的に組み立てる形 ResponseEntity.status(HttpStatus.CREATED) .header("Location", "/users/12") .body(user);

status でコードを決め、header でヘッダを足し、最後に body か build で締めます。本文が無いときは build、あるときは body を呼ぶ、という使い分けです。

201 には Location を付ける

作成に成功したときの定石は、201 と Location ヘッダの組み合わせです。

プレーンテキスト

HTTP/1.1 201 Created Location: /users/12 Content-Type: application/json {"id":12,"name":"sato"}

Location ヘッダには、いま作られたリソースの URL を入れます。クライアントは POST を送った時点では ID を知らないので、これが次の操作への案内になります。本文にも ID を含めておけば、ヘッダを読まないクライアントでも困りません。

Spring には専用の書き方も用意されています。

Java

@PostMapping public ResponseEntity<UserResponse> create(@Valid @RequestBody CreateUserRequest req) { UserResponse created = service.create(req); return ResponseEntity .created(URI.create("/users/" + created.id())) .body(created); }

ResponseEntity.created(uri) は、201 の設定と Location ヘッダの付与を同時に行います。

使い分けの目安

戻り値の型ステータスヘッダ向いている場面
DTO をそのまま200 固定付けられない単純な取得
DTO + @ResponseStatus固定値を指定付けられない常に 201 を返す作成
ResponseEntity実行時に決められる付けられる分岐がある処理・Location が必要な作成

毎回 ResponseEntity で包むと記述が増えるので、必要な場所だけで使うのが現実的です。

演習で確かめます

Spring では ResponseEntity がステータスとヘッダと本文をまとめてレスポンスに変換してくれます。ここではその組み立て結果を自分で文字列として作ります。作成された ID を受け取り、201 と Location ヘッダと JSON 本文を縦棒でつないだ 1 行を返してください。

要件

  1. id が 1 以上のときは 201|Location=/users/12|{"id":12} の形で返すこと
  2. 本文の JSON はキーを二重引用符で囲み、値は引用符なしの数値にすること
  3. id が 0 以下のときは invalid を返すこと

入出力例

buildCreated(12) → "201|Location=/users/12|{"id":12}" buildCreated(1) → "201|Location=/users/1|{"id":1}" buildCreated(100) → "201|Location=/users/100|{"id":100}" buildCreated(0) → "invalid" buildCreated(-5) → "invalid"

ヒント

Java の文字列リテラルの中で二重引用符を出すには、バックスラッシュを前に置いて書きます

3 つの部分を別々の変数に分けてから縦棒で連結すると、引用符の対応が追いやすくなります

Location の値はパス変数の形ではなく、実際の id を埋め込んだ /users/12 のような具体的な URL です

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

関連レッスン

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

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

  • 3層アーキテクチャ

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

  • @Entityとテーブルの対応

    エンティティのマッピングと主キーの指定を確認します。

  • 例外をHTTPに変換する

    例外の種類からステータスコードを決める処理を実装します。

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

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

  • ステータスコード200/201/404 など結果を示す3桁の数値
  • 戻り値呼び出し元への返答を表す点線矢印
  • オブジェクトキーと値のペアで構造を作るデータ
  • メソッドクラスに属する関数
  • ジェネリクス<String> のように型を指定する仕組み
  • 引数位置引数=順番で渡す。
  • URLページの住所全体
  • 処理計算や代入を表す長方形
main.java
学習モード
エディタを読み込んでいます

メモ

ResponseEntityで組み立てる

⌘S で保存