Ajax 弹簧3+出现问题;JSON:HTTP状态406?

Ajax 弹簧3+出现问题;JSON:HTTP状态406?,ajax,json,jquery,spring-mvc,Ajax,Json,Jquery,Spring Mvc,在我的SpringMVC 3.0项目中,我试图通过Ajax发送州名来获取城市列表。 为此,我在JSP中使用了以下调用(使用jQuery): <script type="text/javascript"> function getCities() { jq(function() { jq.post("getCities.html", { stateSelect: jq("#stateSelect").val(

在我的SpringMVC 3.0项目中,我试图通过Ajax发送州名来获取城市列表。 为此,我在JSP中使用了以下调用(使用jQuery):

    <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>

请引导我。我做错了什么??救命

您的响应内容类型不正确,应该是application/json

您需要将jackson添加到/lib目录

你应该有

<mvc:annotation-driven /> 

在serlvet-name.xml文件中


此外,我建议您将您的请求映射为get,并尝试使用googlechrome浏览它,以查看它是否返回正确的结果。它具有非常好的json表示

问题不在服务器端,而在客户端

仔细查看错误消息:根据请求中发送的Accept标头,请求的资源(由服务器端生成))只能生成不可接受的内容(JSON)(由客户端接收!

检查您的请求标题:

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
        );
    });
}
函数getCities(){ jq(函数(){ jq.post( “getCities.html”,//要发布到的URL {stateSelect:jq(“#stateSelect”).val()},//您的数据 函数(数据){//成功回调 jq(“城市”)。替换为(“测试”); }, “json”//您期望从服务器获得的数据类型 ); }); } 这将把Accept头更改为以下内容(从jQuery 1.5开始):

接受:application/json,text/javascript,*/*;q=0.01
这将明确地告诉服务器端您需要JSON。

正如Peter在他的评论中所写,问题的原因是Spring无法加载Jackson。默认情况下,它不是由依赖项加载的。在我添加了依赖项之后

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

org.codehaus.jackson
杰克逊·贾克斯
1.9.2
JSON是在浏览器中键入地址后返回的,没有使用Accept头的任何技巧(正如它应该做的那样)


在Tomcat 7.0上测试。

我在使用Apache HTTPClient调用少数服务时也遇到了类似的问题。问题出在客户端,而不是服务器。我使用了一个头接受application/json的HTTPRequester,它工作得很好。

使用jQuery,您可以将contentType设置为所需的类型(这里是application/json;charset=UTF-8'),并在服务器端设置相同的头


请记住在测试时清除缓存。

如果没有加载Jackson库,Spring应用程序将不会提供application/json,从而触发406。请注意,/的原始request-Accept头应该表示“anywhere”。对于我来说,它是缺少的库。作为记录:必要的Maven组/工件组合是org.codehaus.jackson/jackson-mapper-asl,我刚找到的最新版本是1.9.0(尽管网站上说的是1.9.1)。这在应该是评论而不是答案中有更全面的介绍。
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: application/json, text/javascript, */*; q=0.01
  <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.2</version>
  </dependency>