From 12e75b79b0a302414b41b5eefeb076182207f4f9 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 23 Feb 2026 22:02:18 +0300 Subject: [PATCH] feat: add exception handling --- .../exception/AccessDeniedException.java | 8 +++ .../exception/BadRequestException.java | 8 +++ .../exception/GlobalExceptionHandler.java | 66 +++++++++++++++++++ .../exception/ResourceNotFoundException.java | 8 +++ 4 files changed, 90 insertions(+) create mode 100644 src/main/java/com/example/bankcards/exception/AccessDeniedException.java create mode 100644 src/main/java/com/example/bankcards/exception/BadRequestException.java create mode 100644 src/main/java/com/example/bankcards/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/example/bankcards/exception/ResourceNotFoundException.java diff --git a/src/main/java/com/example/bankcards/exception/AccessDeniedException.java b/src/main/java/com/example/bankcards/exception/AccessDeniedException.java new file mode 100644 index 0000000..e7571f8 --- /dev/null +++ b/src/main/java/com/example/bankcards/exception/AccessDeniedException.java @@ -0,0 +1,8 @@ +package com.example.bankcards.exception; + +public class AccessDeniedException extends RuntimeException { + + public AccessDeniedException(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/bankcards/exception/BadRequestException.java b/src/main/java/com/example/bankcards/exception/BadRequestException.java new file mode 100644 index 0000000..9b837c0 --- /dev/null +++ b/src/main/java/com/example/bankcards/exception/BadRequestException.java @@ -0,0 +1,8 @@ +package com.example.bankcards.exception; + +public class BadRequestException extends RuntimeException { + + public BadRequestException(String message) { + super(message); + } +} diff --git a/src/main/java/com/example/bankcards/exception/GlobalExceptionHandler.java b/src/main/java/com/example/bankcards/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..f01f923 --- /dev/null +++ b/src/main/java/com/example/bankcards/exception/GlobalExceptionHandler.java @@ -0,0 +1,66 @@ +package com.example.bankcards.exception; + +import com.example.bankcards.dto.ErrorResponse; +import java.util.HashMap; +import java.util.Map; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity handleNotFound( + ResourceNotFoundException ex + ) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body( + new ErrorResponse(404, ex.getMessage()) + ); + } + + @ExceptionHandler(BadRequestException.class) + public ResponseEntity handleBadRequest( + BadRequestException ex + ) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body( + new ErrorResponse(400, ex.getMessage()) + ); + } + + @ExceptionHandler(AccessDeniedException.class) + public ResponseEntity handleAccessDenied( + AccessDeniedException ex + ) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).body( + new ErrorResponse(403, ex.getMessage()) + ); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleValidation( + MethodArgumentNotValidException ex + ) { + Map errors = new HashMap<>(); + ex + .getBindingResult() + .getAllErrors() + .forEach(error -> { + String fieldName = ((FieldError) error).getField(); + errors.put(fieldName, error.getDefaultMessage()); + }); + ErrorResponse response = new ErrorResponse(400, "Validation failed"); + response.setErrors(errors); + return ResponseEntity.badRequest().body(response); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleGeneral(Exception ex) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + new ErrorResponse(500, "Internal server error: " + ex.getMessage()) + ); + } +} diff --git a/src/main/java/com/example/bankcards/exception/ResourceNotFoundException.java b/src/main/java/com/example/bankcards/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..6dfc85f --- /dev/null +++ b/src/main/java/com/example/bankcards/exception/ResourceNotFoundException.java @@ -0,0 +1,8 @@ +package com.example.bankcards.exception; + +public class ResourceNotFoundException extends RuntimeException { + + public ResourceNotFoundException(String message) { + super(message); + } +}