| この記事の要点 |
|---|
|
@ResponseBody とは
通常の Spring MVC では、@Controller のメソッドは戻り値を「View 名」と解釈し、ViewResolver が JSP / Thymeleaf 等のテンプレートを探します。
@ResponseBody を付けると、この View 解決をスキップし、戻り値をそのままレスポンスボディに書き出します。HttpMessageConverter(Jackson 等)が JSON / XML に変換します。
基本的な使い方
メソッドレベル
@Controller
public class UserController {
@GetMapping("/users/{id}")
@ResponseBody // ← この戻り値だけ JSON で返す
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@GetMapping("/users/list")
public String listView() {
return "users/list"; // ← こちらは View 名 (users/list.jsp 等)
}
}
クラスレベル(@RestController)
すべてのメソッドが API レスポンスを返すなら @RestController が便利:
@RestController // = @Controller + @ResponseBody
@RequestMapping("/api/users")
public class UserApiController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) { // @ResponseBody 不要
return userService.findById(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.create(user);
}
}
レスポンス形式(JSON / XML / その他)
戻り値の変換は HttpMessageConverter が担当します。クライアントが Accept ヘッダで何を要求しているかで形式が決まる:
| Accept ヘッダ | 変換 | 必要な依存 |
|---|---|---|
application/json | Jackson / Gson で JSON | Spring Boot に標準同梱(Jackson) |
application/xml | JAXB / Jackson XML で XML | jackson-dataformat-xml 追加 |
text/plain | String そのまま | 標準 |
text/html | String そのまま(HTML として解釈) | 標準 |
レスポンスステータスとヘッダの制御
① @ResponseStatus
@PostMapping("/users")
@ResponseStatus(HttpStatus.CREATED) // 201
public User create(@RequestBody User user) {
return userService.create(user);
}
② ResponseEntity(細かい制御)
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
Optional<User> user = userService.findByIdOptional(id);
return user
.map(u -> ResponseEntity.ok()
.header("X-Custom-Header", "value")
.body(u))
.orElseGet(() -> ResponseEntity.notFound().build());
}
// 簡潔形
return ResponseEntity.status(HttpStatus.CREATED).body(user);
return ResponseEntity.noContent().build(); // 204
return ResponseEntity.badRequest().body(errorDto); // 400
JSON 出力のカスタマイズ
① Jackson アノテーションで制御
public class User {
private Long id;
@JsonProperty("user_name") // JSON のキー名変更
private String name;
@JsonIgnore // JSON 出力から除外
private String password;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate birthDate;
@JsonInclude(JsonInclude.Include.NON_NULL) // null は出力しない
private String email;
}
② application.properties での共通設定
# キーをスネークケースに
spring.jackson.property-naming-strategy=SNAKE_CASE
# null は出力しない
spring.jackson.default-property-inclusion=non_null
# 日付フォーマット
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Tokyo
@ResponseBody vs @RestController vs @Controller
| 用途 | 使うもの |
|---|---|
| API のみのクラス | @RestController |
| HTML View のみのクラス | @Controller |
| HTML View + 一部 API(混在) | @Controller + 一部メソッドに @ResponseBody |
よくあるトラブル
Q. JSON でなく文字列がそのまま返る
- 戻り値が String 型: そのまま
text/plainで返る → DTO に変えるか、明示的に JSON 形式で返す - Jackson が classpath にない:
spring-boot-starter-webを依存に追加
Q. レスポンスが空 ({})
- getter がない: Jackson は getter を見るので必須
- Lombok の
@Dataや@Getterで getter 生成
Q. 文字化け(日本語が ???)
# application.properties
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
関連記事
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15