| この記事の要点 |
|---|
|
@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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38