GlobalExceptionHandler.java
package org.petify.image.exception;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ProblemDetail;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(AccessDeniedException.class)
ProblemDetail handleAccessDeniedException(WebRequest request) {
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.FORBIDDEN);
problemDetail.setTitle("Access Denied");
problemDetail.setDetail(request.getDescription(false));
problemDetail.setProperty("timestamp", Instant.now());
return problemDetail;
}
@ExceptionHandler(Exception.class)
ProblemDetail handleGenericException(Exception ex) {
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.INTERNAL_SERVER_ERROR);
problemDetail.setTitle("Internal Server Error");
problemDetail.setDetail("An unexpected error occurred: " + ex.getMessage());
problemDetail.setProperty("timestamp", Instant.now());
return problemDetail;
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatusCode status,
WebRequest request) {
ProblemDetail problemDetail = ProblemDetail.forStatus(status);
problemDetail.setTitle("Validation Failed");
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage())
);
problemDetail.setProperty("errors", errors);
return new ResponseEntity<>(problemDetail, headers, status);
}
@ExceptionHandler(ImageNotFoundException.class)
ProblemDetail handleImageNotFound(ImageNotFoundException ex) {
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.NOT_FOUND);
problemDetail.setTitle("Image Not Found");
problemDetail.setDetail(ex.getMessage());
problemDetail.setProperty("timestamp", Instant.now());
return problemDetail;
}
@ExceptionHandler(MaxImagesReachedException.class)
ProblemDetail handleMaxImagesReached(MaxImagesReachedException ex) {
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.CONFLICT);
problemDetail.setTitle("Max Images Reached");
problemDetail.setDetail(ex.getMessage());
problemDetail.setProperty("timestamp", Instant.now());
return problemDetail;
}
}