⚠️
Validation & Error Handling

Global Exception Handling

@RestControllerAdvice Deep Dive
💡 @RestControllerAdvice, EK CENTRAL COMPLAINT DESK hai, EK BADE MALL mein — HAR SHOP (CONTROLLER) mein, SEPARATE COMPLAINT DESK (try-catch) rakhne ke BAJAYE, EK CENTRAL DESK, SAARI COMPLAINTS (EXCEPTIONS), CONSISTENT tareeke SE, HANDLE karta hai.

@RestControllerAdvice, EK CENTRALIZED CLASS DEFINE karta hai, JO, SAARE @RestController classes ke, EXCEPTIONS ko, HANDLE karta hai — HAR CONTROLLER mein, DUPLICATE try-catch LIKHNE ke BAJAYE, EK JAGAH, @ExceptionHandler METHODS SE, DIFFERENT EXCEPTION TYPES ko, DIFFERENT RESPONSES mein, CONVERT kiya jaata hai.

EK TYPICAL, WELL-DESIGNED GLOBAL HANDLER, MULTIPLE, SPECIFIC EXCEPTIONS (jaise ResourceNotFoundException → 404, ValidationException → 400) ko, HANDLE karta hai, aur, AAKHIR mein, EK GENERIC Exception.class HANDLER, "SAFETY NET" ke ROOP mein, RAKHTA hai (500 Internal Server Error).

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {
        ErrorResponse error = new ErrorResponse("NOT_FOUND", ex.getMessage());
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(err ->
            errors.put(err.getField(), err.getDefaultMessage()));
        return ResponseEntity.badRequest().body(errors);
    }

    @ExceptionHandler(Exception.class)   // catch-all, LAST resort
    public ResponseEntity<ErrorResponse> handleGeneric(Exception ex) {
        return ResponseEntity.internalServerError()
            .body(new ErrorResponse("INTERNAL_ERROR", "Unexpected error occurred"));
    }
}
⚠️
@RestControllerAdvice, EK CENTRAL COMPLAINT DESK hai, EK BADE MALL mein — HAR SHOP (CONTROLLER) mein, SEPARATE COMPLAINT DESK (try-catch) rakhne ke BAJAYE, EK CENTRAL DESK, SAARI COMPLAINTS (EXCEPTIONS), CONSISTENT tareeke SE, HANDLE karta hai.
1 / 2
⚡ झट से Recap
  • @RestControllerAdvice = CENTRALIZED exception handling, saare controllers ke liye
  • Specific exceptions PEHLE, generic Exception.class, LAST (catch-all)
  • Field-level validation errors, CLIENT ko, DETAILED format mein DIYE ja sakte hain
इस page में (2 subtopics)

AGAR, MULTIPLE, @ExceptionHandler METHODS, EK, HI, EXCEPTION HIERARCHY mein hain (jaise, EK, IllegalArgumentException ke liye, aur, EK, GENERIC Exception ke liye), Spring, "MOST SPECIFIC" MATCH, CHOOSE karta hai — SPECIFIC EXCEPTION, PEHLE, TRIGGER hoती hai.

💡Tip: Generic, Exception.class HANDLER, HAMESHA, LAST, RESORT hona CHAHIYE — SPECIFIC, EXCEPTIONS, PEHLE, HANDLE HONI CHAHIYE.

GLOBAL, EXCEPTION HANDLER, EK, IDEAL, JAGAH hai, HAR, EXCEPTION ko, CENTRALLY, LOG karne ke liye — STACK TRACE, REQUEST DETAILS, aur, TIMESTAMP, LOG karके, DEBUGGING/MONITORING, EASY BANAYA ja sakta hai.

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGeneric(Exception ex, HttpServletRequest req) {
    log.error("Unhandled exception at {}: ", req.getRequestURI(), ex);
    return ResponseEntity.internalServerError().body(new ErrorResponse("INTERNAL_ERROR", "..."));
}