ApiExceptionHandler.java
package com.example.orderplatform;
import java.net.URI;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
class ApiExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
ProblemDetail handleNotFound(ResourceNotFoundException exception) {
return problem(HttpStatus.NOT_FOUND, "Resource not found", exception.getMessage());
}
@ExceptionHandler(ResourceConflictException.class)
ProblemDetail handleConflict(ResourceConflictException exception) {
return problem(HttpStatus.CONFLICT, "Conflict", exception.getMessage());
}
@ExceptionHandler(BusinessRuleViolationException.class)
ProblemDetail handleBusinessRule(BusinessRuleViolationException exception) {
return problem(HttpStatus.BAD_REQUEST, "Business rule violation", exception.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
ProblemDetail handleMethodArgumentNotValid(MethodArgumentNotValidException exception) {
ProblemDetail problem = problem(HttpStatus.BAD_REQUEST, "Validation failed", "The request payload is invalid.");
List<String> errors = exception.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.toList();
problem.setProperty("errors", errors);
return problem;
}
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
ProblemDetail handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException exception) {
return problem(HttpStatus.BAD_REQUEST, "Validation failed", "The request parameters are invalid.");
}
@ExceptionHandler(HttpMessageNotReadableException.class)
ProblemDetail handleHttpMessageNotReadable(HttpMessageNotReadableException exception) {
return problem(HttpStatus.BAD_REQUEST, "Malformed request", "The request body could not be read.");
}
private ProblemDetail problem(HttpStatus status, String title, String detail) {
ProblemDetail problem = ProblemDetail.forStatusAndDetail(status, detail);
problem.setType(URI.create("https://example.com/problems/" + title.toLowerCase().replace(' ', '-')));
problem.setTitle(title);
return problem;
}
}