Я не уверен, почему, но @ControllerAdvice
переопределяет код ответа, определенный на уровне Exception
, используя аннотацию @ResponseStatus
.@ControllerAdvice переопределяет исключение @ResponseStatus
Исключение:
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class GreetException extends RuntimeException {}
Контроллер:
@RestController
@RequestMapping("/")
public class GreetController {
@RequestMapping(method = RequestMethod.GET)
public String greet() {
throw new GreetException();
}
}
Controlle Совет:
@ControllerAdvice
public class ExceptionConfiguration {
@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(RuntimeException.class)
public void handleConflict() {}
}
Когда метод приветствия от GreetController
получил ответ, это ответ 409 - КОНФЛИКТ. Поскольку я специально предоставил код ответа на уровне исключения, я ожидал, что это будет возвращенный код (400 - BAD_REQUEST).
Конечно, это слишком упрощенный пример, но мы определили совет контроллера с определением RuntimeException
, чтобы мы могли назначить идентификатор для каждого исключения, которое не было обнаружено.
Каков правильный способ достижения ожидаемого поведения?
в вас controllerAdvice класс, вы должны использовать класс GreetException, как ExceptionHandler вместо класса RuntimeException. ** @ ExceptionHandler (GreetException.класс) public void handleConflict() {} **. Последний класс, который будет выполняться при вызове исключения, будет вашим контроллером. – duardito
Может быть [эта ссылка должна помочь] (http://www.ekiras.com/2016/02/how-to-do-exception-handling-in-springboot-rest-application.html) –
@duardito Обработчик исключений для RuntimeException следует поймать все, что не было поймано. Поскольку я объявляю статус ответа для GreetException, я не ожидаю использовать обработчик RuntimeE. – mvlupan