Ajax-метод контроллера Spring MVC

#ajax #jquery #spring-mvc

#ajax #jquery #spring-mvc

Вопрос:

У меня есть некоторое веб-приложение, которое использует jQuery для отправки AJAX-запросов на сервер. Один из методов (в контроллере) возвращает объект ModelAndView, который может быть HTML-кодом или объектом JSON — зависит от существующих ошибок. Входными параметрами этого метода является массив JSON (форма). Определение метода:

 @RequestMapping(value = "/generate", method = RequestMethod.POST, headers = BaseController.AJAX_HEADER)
public ModelAndView generate(@RequestBody HandlingReportForm form, HttpServletResponse response) {...}
  

Метод jQuery выглядит следующим образом:

 jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json',
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback,
    error : function(jqXHR, textStatus, errorThrown) {
        alert(errorThrown);
    },
    complete : function(jqXHR, textStatus) {
        alert(textStatus);
    }
});
  

Когда сервер возвращает массив JSON, проблем не возникает. Проблема возникает, когда ответ сервера является html. Я получаю исключение «parseerror». Я полагаю, что jQuery пытается разобрать строку ответа в JSON. Я прав?
Как я могу отключить этот автоматический синтаксический анализ? Есть ли другой способ реализовать такой универсальный метод?

Спасибо, спасибо вам

Ответ №1:

Тип данных был указан как json, следовательно, jQuery попытается интерпретировать ответ как объект json.

Документация по jQuery Ajax

Тип данных — «json»: оценивает ответ как JSON и возвращает объект JavaScript. В jQuery 1.4 данные JSON анализируются строгим образом; любой неверно сформированный JSON отклоняется и выдается ошибка синтаксического анализа. (Смотрите json.org для получения дополнительной информации о правильном форматировании JSON.)

Лучше возвращать единый формат ответа.

Вы также можете исключить аргумент типа данных.
Если не указан ни один, jQuery попытается вывести его на основе MIME-типа ответа (MIME-тип XML выдаст XML, в версии 1.4 JSON выдаст объект JavaScript, в версии 1.4 script выполнит скрипт, а все остальное будет возвращено в виде строки).

Комментарии:

1. Да, я удалил тип данных, поэтому все возвращается в виде строки. Затем я преобразую его в JSON, если необходимо. Спасибо

2. Кстати, похоже, что последние версии jQuery (я использую 1.6.2) могут автоматически анализировать объект JSON даже без указания атрибута DataType.

3. да, он интерпретирует тип данных и должен преобразовать данные.