Возвращение JSON с весны на 404 в бесплатном проекте XML
В настоящее время я настраиваю приложение Spring MVC (версия 4.1.4.RELEASE) и хочу, чтобы приложение возвращало строку JSON с ошибкой 404, а не ответ html по умолчанию. Я использую Tomcat 8 в качестве моего сервера. У меня есть то, что, по моему мнению, должно быть правильным, однако оно ведет себя не так, как я ожидаю. То, что я пытаюсь сделать, основано на этом ответе.
public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
...
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration){
registration.setInitParameter("throwExceptionIfNoHandlerFound","true");
}
}
и затем у меня есть контроллер исключений (который отличается от вопроса, на котором я основал свое решение, однако я не верю, что это проблема, поскольку у меня сложилось впечатление, что @ControllerAdvice - приемлемый способ управления этим на основе Spring Docs. Это выглядит примерно так:
@ControllerAdvice
public class GlobalExceptionController{
@ResponseStatus(value=HttpStatus.NOT_FOUND)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Message handleMethodNotSupported(HttpServletRequest request){
...
}
@ResponseStatus(value=HttpStatus.NOT_FOUND)
@ExceptionHandler(NoSuchRequestHandlingMethodException.class)
public Message handleBadRequest(HttpServletRequest request){
...
}
@ResponseStatus(value=HttpStatus.NOT_FOUND)
@ExceptionHandler(NoHandlerFoundException.class)
public Message requestHandlingNoHandlerFound(HttpServletRequest request){
...
}
...
}
Он продолжает отправлять ответ по умолчанию. Я точно знаю, что это ударяет по моей функции customizeRegistration(), потому что точки останова останавливают ее, однако любые точки останова, которые есть в моем классе GlobalException, не удаляются. Кроме того, класс GlobalException находится в пакете, к которому применяется аннотация @ComponentScan(), поэтому я вполне уверен, что он также обрабатывается весной.
Я предполагаю, что упускаю что-то очевидное, любая помощь будет принята с благодарностью.
1 ответ
Я не думаю, что возвращаемый тип, который вы пытаетесь использовать, поддерживается. Вы пытались изменить возвращаемое значение на ResponseEntity или добавить аннотацию @ResponseBody? Из документов:
- Объект ModelAndView (сервлет MVC или портлет MVC).
- Объект Model, имя представления которого неявно определяется с помощью RequestToViewNameTranslator.
- Объект Map для экспонирования модели, имя представления которого неявно определяется с помощью RequestToViewNameTranslator.
- Просмотр объекта.
- Строковое значение, которое интерпретируется как имя представления.
- @ResponseBody аннотированные методы (только для сервлетов) для установки содержимого ответа. Возвращаемое значение будет преобразовано в поток ответов с использованием конвертеров сообщений.
- Объект HttpEntity или ResponseEntity (только для сервлетов) для установки заголовков и содержимого ответа. Тело ResponseEntity будет преобразовано и записано в поток ответов с использованием преобразователей сообщений.
- void, если метод обрабатывает сам ответ (записывая содержимое ответа напрямую, объявляя аргумент типа ServletResponse / HttpServletResponse / RenderResponse для этой цели), или если предполагается, что имя представления неявно определяется через RequestToViewNameTranslator (не объявляя аргумент ответа в сигнатуре метода обработчика; применимо только в среде сервлета).