Spring 3.2.15, API REST на основе MVC здесь (не Весенняя загрузка, к сожалению!). Я пытаюсь реализовать исключение сопоставителя/обработчик, который отвечает следующим критериям:Spring MV 3.2 Отображение ответов на исключение
- Независимо от того, что происходит (успех или ошибка), то Spring приложение всегда возвращает ответ объект из
MyAppResponse
(смотри ниже); и - В случае успешной обработки запроса вернуть HTTP-статус 200 (типичный); и
- В случае обработки запроса и исключение происходит, мне нужно контролировать отображение конкретного исключения кодом состояния частности HTTP
- Spring MVC рамки ошибок (таких, как
BlahException
) необходимо сопоставить с HTTP 422 - исключения пользовательских приложений, таких, как мой
FizzBuzzException
имеют свои собственные схемы отображения состояния:FizzBuzzException
-> HTTP 401FooBarException
-> HTTP 403OmgException
-> HTTP 404
- Все другие исключения, то есть, не пружинные исключения и без пользовательских исключений приложения (3 перечислены выше), должны производить HTTP 500
- Spring MVC рамки ошибок (таких, как
Где MyAppResponse
объект:
// Groovy pseudo-code
@Canonical
class MyAppResponse {
String detail
String randomNumber
}
это появляется как ResponseEntityExceptionHandler
мог бы сделать это для меня, но я не вижу лес через деревья w.r.t. как он получает переданные аргументы. Я надеюсь, что я могу сделать что-то вроде:
// Groovy-pseudo code
@ControllerAdvice
class MyAppExceptionMapper extends ResponseEntityExceptionHandler {
ResponseEntity<Object> handleFizzBuzzException(FizzBuzzException fbEx, HttpHeaders headers, HttpStatus status) {
// TODO: How to reset status to 401?
status = ???
new ResponseEntity(fbEx.message, headers, status)
}
ResponseEntity<Object> handleFooBarException(FooBarException fbEx, HttpHeaders headers, HttpStatus status) {
// TODO: How to reset status to 403?
status = ???
new ResponseEntity(fbEx.message, headers, status)
}
ResponseEntity<Object> handleOmgException(OmgException omgEx, HttpHeaders headers, HttpStatus status) {
// TODO: How to reset status to 404?
status = ???
new ResponseEntity(omgEx.message, headers, status)
}
// Now map all Spring-generated exceptions to 422
ResponseEntity<Object> handleAllSpringExceptions(SpringException springEx, HttpHeaders headers, HttpStatus status) {
// TODO: How to reset status to 422?
status = ???
new ResponseEntity(springEx.message, headers, status)
}
// Everything else is a 500...
ResponseEntity<Object> handleAllOtherExceptions(Exception ex, HttpHeaders headers, HttpStatus status) {
// TODO: How to reset status to 500?
status = ???
new ResponseEntity("Whoops, something happened. Lol.", headers, status)
}
}
Любой идеи, как я могу в полной мере реализовать это отображение логику и требование сущности быть MyAppResponse
экземпляром, а не просто строка?
Затем комментирует класс с @ControllerAdvice
Единственное, что мне нужно сделать, чтобы настроить Spring на его использование?
Спасибо @ Gregory.K (+1) - см. Мой комментарий под ответом Бонда. У меня к тебе тот же вопрос! Еще раз спасибо! – smeeb
@smeeb, я только что добавил «Как настроить сервлет MVC Dispatcher». –