@ControllerAdvice public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @Override protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { List fieldErrors = ex.getBindingResult().getFieldErrors(); List globalErrors = ex.getBindingResult().getGlobalErrors(); List errors = new ArrayList<>(fieldErrors.size() + globalErrors.size()); String error; for (FieldError fieldError : fieldErrors) { error = fieldError.getField() + ", " + fieldError.getDefaultMessage(); errors.add(error); } for (ObjectError objectError : globalErrors) { error = objectError.getObjectName() + ", " + objectError.getDefaultMessage(); errors.add(error); } ErrorMessage errorMessage = new ErrorMessage(errors); return new ResponseEntity(errorMessage, headers, status); } @Override protected ResponseEntity handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { String unsupported = "Unsupported content type: " + ex.getContentType(); String supported = "Supported content types: " + MediaType.toString(ex.getSupportedMediaTypes()); ErrorMessage errorMessage = new ErrorMessage(unsupported, supported); return new ResponseEntity(errorMessage, headers, status); } @Override protected ResponseEntity handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { Throwable mostSpecificCause = ex.getMostSpecificCause(); ErrorMessage errorMessage; if (mostSpecificCause != null) { String exceptionName = mostSpecificCause.getClass().getName(); String message = mostSpecificCause.getMessage(); errorMessage = new ErrorMessage(exceptionName, message); } else { errorMessage = new ErrorMessage(ex.getMessage()); } return new ResponseEntity(errorMessage, headers, status); } }