Возвращение 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 (не объявляя аргумент ответа в сигнатуре метода обработчика; применимо только в среде сервлета).
Другие вопросы по тегам