Ситуация
Я реализовал глобальный обработчик исключений, а именно CustomResponseEntityExceptionHandler.java
следующим образом:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
public final ResponseEntity<ExceptionResponse> handleAllExceptions(Exception ex, WebRequest request) {
return new ResponseEntity<>(new ExceptionResponse(ex.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(EntityNotFoundException.class)
public final ResponseEntity<ExceptionResponse> handleEntityNotFoundException(Exception ex, WebRequest request) {
return new ResponseEntity<>(new ExceptionResponse(ex.getMessage()), HttpStatus.NOT_FOUND);
}
}
Как видите, есть два метода обработчика:
- Один для любого исключения (
Exception.class
) - Один для моего пользовательского определенного
ExceptionResponse.java
класса
В моем @RestController
классе я жестко закодировал throw new EntityNotFoundException()
:
@RestController
@RequestMapping("/admin/challenge")
public class AdminChallengeController {
@GetMapping("/{id}")
public Challenge findById(@PathVariable Long id) {
throw new EntityNotFoundException("hardcoded message");
}
// other class members
Проблема
При отправке запроса в "/ admin / challenge / 1" @ControllerAdvice никогда не выполняется. Я проверил это, вставив жестко закодированное сообщение в класс @ControllerAdvice (НЕ сам Контроллер, как указано выше), и после этого в ответ возвращается сообщение от Контроллера, а НЕ строка @ControllerAdvice. Кроме того, хотя я получаю ошибку 404, я все равно получаю ошибку 500.
Кто-нибудь может мне помочь?
Обновление
В ответ на принятый пост, проблема заключалась в отсутствии методов получения и установки соответствующих полей внутри класса ExceptionResponse.java
.