Проблема с Spring 3 + JSON: статус HTTP 406? - PullRequest
8 голосов
/ 13 февраля 2011

Я пытаюсь получить список городов, отправив название штата через Ajax в моем проекте SpringMVC 3.0. Для этой цели я использовал следующий вызов (используя jQuery) в моем JSP:

    <script type="text/javascript">
function getCities() {
    jq(function() {
        jq.post("getCities.html",
                    {   stateSelect:  jq("#stateSelect").val()},
                        function(data){
                            jq("#cities").replaceWith('<span id="cities">Testing</span>');
                    });
    });
}
</script>

А вот мой код контроллера:

@RequestMapping(value = "/getCities", method = RequestMethod.POST)
    public @ResponseBody List<StateNames> getCities(@RequestParam(value="stateSelect", required=true) String stateName,
                                Model model) {
        // Delegate to service to do the actual adding
        List<StateNames> listStates = myService.listCityNames(stateName);

        // @ResponseBody will automatically convert the returned value into JSON format
        // You must have Jackson in your classpath
        return listStates;
    }

Но я получаю сообщение об ошибке HTTP 406, заявляющее следующее при его запуске: 406 Недопустимо Запрашиваемый ресурс способен генерировать контент, неприемлемый только в соответствии с заголовками Accept, отправленными в запросе.

Я использовал Джексона в моих зависимостях Maven и определил в моем файле контекста. Я много гуглил и думаю, проблема в том, что @ResponseBody не конвертирует мой список автоматически в соответствующий объект JSON.

Мой Firebug говорит:

Response Headers  
Server  Apache-Coyote/1.1  
Content-Type    text/html;charset=utf-8  
Content-Length  1070  
Date    Sat, 12 Feb 2011 13:09:44 GMT  

Request Headers  
Host    localhost:8080  
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13  
Accept  */*  
Accept-Language en-us,en;q=0.5  
Accept-Encoding gzip,deflate  
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7  
Keep-Alive  115  
Connection  keep-alive  
Content-Type    application/x-www-form-urlencoded; charset=UTF-8  
X-Requested-With    XMLHttpRequest  
Referer http://localhost:8080/MyApplication/  
Content-Length  17  
Cookie  JSESSIONID=640868A479C40792F8AB3DE118AF12E0  
Pragma  no-cache  
Cache-Control   no-cache 

Пожалуйста, ведите меня. Что я делаю неправильно?? HELP !!

Ответы [ 5 ]

8 голосов
/ 02 декабря 2011

Как писал Питер в своем комментарии, причиной проблемы является неспособность Spring загрузить Джексона. По умолчанию не загружается по зависимостям. После того, как я добавил зависимость

  <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.2</version>
  </dependency>

JSON был возвращен после ввода адреса в браузере, без каких-либо ухищрений с заголовками Accept (как и положено).

Проверено на Tomcat 7.0.

7 голосов
/ 13 февраля 2011

У вас неправильный тип содержимого ответа, это должно быть application / json.

Вам необходимо добавить Джексона в ваш каталог / lib.

и у вас должно быть

<mvc:annotation-driven /> 

В вашем файле serlvet-name.xml.

Кроме того, я рекомендую вам сопоставить ваш запрос с запросом get и попытаться просмотреть его с помощью Google Chrome, чтобы убедиться, что он возвращает правильный результат. У него очень хорошее представление в формате JSON.

3 голосов
/ 23 февраля 2011

Проблема не на стороне сервера, а на стороне клиента.

Внимательно посмотрите на сообщение об ошибке: Запрашиваемый ресурс (, генерируемый на стороне сервера ), способен толькосоздание контента ( JSON ) недопустимо ( клиентом! ) в соответствии с заголовками Accept, отправленными в запросе.

Проверьте заголовки вашего запроса:

Accept  */*

Попробуйте следующим образом:

function getCities() {
    jq(function() {
        jq.post(
            "getCities.html",                          // URL to post to
            { stateSelect: jq("#stateSelect").val() }, // Your data
            function(data) {                           // Success callback
                jq("#cities").replaceWith('<span id="cities">Testing</span>');
            },
            "json"                                     // Data type you are expecting from server
        );
    });
}

Это изменит ваш заголовок Accept на следующий (начиная с jQuery 1.5):

Accept: application/json, text/javascript, */*; q=0.01

Это будет явно сообщить стороне сервера, что вы ожидаете JSON.

0 голосов
/ 07 февраля 2014

Используя jQuery, вы можете установить для contentType желаемый (application / json; charset = UTF-8 'здесь) и установить тот же заголовок на стороне сервера.

ПОМНИТЕ, ЧТОБЫ ОЧИСТИТЬ КЭШ во время тестирования.

0 голосов
/ 04 ноября 2013

У меня тоже была похожая проблема при использовании Apache HTTPClient для вызова нескольких сервисов. Проблема в клиенте, а не в сервере. Я использовал HTTPRequester с заголовком, принимающим application / json, и он работал нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...