| この記事の要点 |
|---|
|
@RestController の基本
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public UserDto get(@PathVariable Long id) {
return userService.findById(id);
// ← 自動で JSON 化されてレスポンスボディに書き出される
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public UserDto create(@RequestBody UserCreateRequest req) {
return userService.create(req);
}
@PutMapping("/{id}")
public UserDto update(@PathVariable Long id, @RequestBody UserUpdateRequest req) {
return userService.update(id, req);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable Long id) {
userService.delete(id);
}
}
@RestController vs @Controller
| 項目 | @RestController | @Controller |
|---|---|---|
| 用途 | REST API | HTML View 返却 |
| 戻り値 | JSON / XML として直接出力 | View 名として解釈、テンプレート探す |
| @ResponseBody | クラス全体に暗黙適用 | 個別メソッドに付ける必要 |
| 典型例 | 外部 API / SPA バックエンド | サーバサイドレンダリング |
レスポンスの型
① POJO / DTO(標準)
@GetMapping("/{id}")
public UserDto get(@PathVariable Long id) {
return userService.findById(id);
}
// → {"id": 1, "name": "Alice", "email": "..."}
② List / Map
@GetMapping
public List<UserDto> list() {
return userService.findAll();
}
@GetMapping("/summary")
public Map<String, Object> summary() {
return Map.of(
"total", 100,
"active", 80
);
}
③ ResponseEntity(ステータス・ヘッダ制御)
@GetMapping("/{id}")
public ResponseEntity<UserDto> get(@PathVariable Long id) {
return userService.findByIdOptional(id)
.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.notFound().build());
}
@PostMapping
public ResponseEntity<UserDto> create(@RequestBody UserCreateRequest req) {
UserDto created = userService.create(req);
URI location = URI.create("/api/users/" + created.getId());
return ResponseEntity.created(location).body(created);
}
④ ストリーミング
@GetMapping(value = "/export", produces = "text/csv")
public ResponseEntity<StreamingResponseBody> export() {
StreamingResponseBody body = out -> {
userService.streamAll().forEach(user -> {
try {
out.write((user.toCsvLine() + "\n").getBytes(StandardCharsets.UTF_8));
} catch (IOException e) { throw new RuntimeException(e); }
});
};
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=\"users.csv\"")
.body(body);
}
例外ハンドリング
@RestController
public class UserController {
@GetMapping("/{id}")
public UserDto get(@PathVariable Long id) {
return userService.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found"));
}
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleNotFound(UserNotFoundException ex) {
return new ErrorResponse("USER_NOT_FOUND", ex.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidation(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage())
);
return errors;
}
}
// グローバルエラーハンドラ
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleAll(Exception ex) {
log.error("Unexpected", ex);
return new ErrorResponse("INTERNAL_ERROR", "システムエラー");
}
}
関連記事
子ページ
子ページはありません
人気ページ
- 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・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09