4.4. 例外処理
4.4.1. グローバル例外処理
@RestControllerAdvice を使用し、アプリケーション全体の例外を一貫して処理します。
java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException e) {
ErrorCode errorCode = e.getErrorCode();
return ResponseEntity
.status(errorCode.getHttpStatus())
.body(ErrorResponse.of(errorCode));
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationException(
MethodArgumentNotValidException e) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(ErrorResponse.of(ErrorCode.INVALID_INPUT, e.getBindingResult()));
}
}4.4.2. エラーコード定義
エラーコードは Enum で一元管理します。
java
@Getter
@RequiredArgsConstructor
public enum ErrorCode {
// 共通
INVALID_INPUT(HttpStatus.BAD_REQUEST, "C001", "入力値が不正です。"),
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "C002", "サーバー内部エラーが発生しました。"),
RESOURCE_NOT_FOUND(HttpStatus.NOT_FOUND, "C003", "要求されたリソースが見つかりません。"),
// ユーザー
USER_NOT_FOUND(HttpStatus.NOT_FOUND, "U001", "ユーザーが見つかりません。"),
DUPLICATE_EMAIL(HttpStatus.CONFLICT, "U002", "既に使用されているメールアドレスです。");
private final HttpStatus httpStatus;
private final String code;
private final String message;
}4.4.3. 標準エラーレスポンス形式
json
{
"code": "U001",
"message": "ユーザーが見つかりません。",
"timestamp": "2026-02-28T10:30:00"
}