Чтобы глобально обрабатывать ошибки (например, HTTP 404), которые могут возникать вне контроллера, у меня есть записи, похожие на следующие в моем web.xml:
<error-page>
<error-code>404</error-code>
<location>/errors/404</location>
</error-page>
В моем ErrorController у меня есть соответствующие методы, похожие на следующие:
@Controller
@RequestMapping("/errors")
public class ErrorController {
@RequestMapping(value = "/404", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<ErrorResponse> error404() {
ErrorResponse errorBody = new ErrorResponse(404, "Resource Not Found!");
return new ResponseEntity<ErrorResponse>(errorBody, HttpStatus.NOT_FOUND);
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что сконфигурированные ContentNegotiationManager
и конвертеры сообщений, которые я сконфигурировал, в этом случае не используются. Я подозреваю, что, поскольку запрос перенаправляется на страницу с ошибкой, исходные атрибуты запроса, используемые в согласовании контента, теряются, и это рассматривается как полностью отдельный запрос. (т.е. исходный запрос для /mycontroller/badresource.json → /errors/404 (без расширения файла))
Есть ли какой-либо способ в обработчике ошибок, подобный этому, определять и/или отвечать соответствующим типом контента, как это запрошено в исходном запросе?