Spring MVC将响应对象发送到ajax帖子会产生406错误

时间:2016-03-21 23:37:26

标签: json ajax spring-mvc http-headers jackson

有类似的链接,但我找不到任何适合我的解决方案,所以我想知道是否有人可以为我的方案提供一个有效的示例。我正在做ajax从服务器端检索数据,所以我可以在客户端动态创建图表。我需要包含MappingJacksonHttpMessageConverter吗?如果那个答案可以有人提供一个例子我可以遵循吗?

爪哇:

@RequestMapping(value="/getReportData.html", method=RequestMethod.GET, produces="application/json")
public @ResponseBody Reports getReport1Data(HttpServletRequest request)
{
    System.out.println("Report 1 Page GET Method");

    ModelAndView mv = new ModelAndView("report1");  

    if((Reports)request.getSession().getAttribute(USER_SESSION_REPORTS) != null){
        reports = (Reports)request.getSession().getAttribute(USER_SESSION_REPORTS);
        System.out.println("--------> Report 1 Page with session data");
        return reports;
    }
    else{
        System.out.println("--------> Report 1 Page with NO session data");
    }
    mv.addObject("report1", reports.getReport1());

    return null;
}

使用Javascript:

function getData(){
$.ajax({
    url: "getReportData.html",
    type: "GET",
    contentType: "application/json",
    dataType: JSON,
    success: function(report1){
        console.log("success: " + report1.utilRatio.decRatio);
    },
    error: function(report1){
        console.log("error: " + report1.utilRatio.decRatio);
    }
});

}

响应标题: 内容语言:" zh", 内容长度:" 1110" 内容类型:" text / html; charset = utf-8" 服务器:" Apache-Coyote / 1.1"

请求标题: 接受:" / " 接受语言:" en-US,en; q = 0.5" 接受编码:" gzip,deflate" 内容类型:" application / json" X-Requested-With :" XMLHttpRequest"

2 个答案:

答案 0 :(得分:1)

看起来您的请求标头有误。您可以删除contentType设置,因为您没有将数据发送到服务器并将dataType更改为字符串值" json"而不是变量JSON。

此外,您的回复标头错误。只需确保您始终返回Reports对象。并且您可能希望从该端点删除html扩展名,因为您只是返回一个对象。

答案 1 :(得分:0)

spring使用@ResponseBody注释来返回数据,因为json .it会隐式调用MappingJacksonHttpMessageConverter。所以你需要使用它。

@RequestMapping(value = "/getjson", method = RequestMethod.POST, produces = "application/json")
@Transactional
public void getJson(HttpServletRequest request, HttpServletResponse response, @RequestParam("type") String type)
        throws DatatypeConfigurationException, IOException, JSONException {
    JSONObject json = new JSONObject();
    Map<String, String[]> parameterMap = request.getParameterMap();
              List<Chart> chart=myService.getChart();
                        if (Chart.size()>0) {
                json.put("status", "SUCCESS");
                JSONArray array = new JSONArray();
                for (Chart chartData: chart) {
                    JSONObject object = new JSONObject();
                    object.put("id", chartData.getRaasiId());
                    object.put("name", chartData.getName());
                    array.put(object);
                }
                json.put("options", array);
            }
        }
    } 
    response.setContentType("application/json");
    System.out.println("response======" + json.toString());
    PrintWriter out = response.getWriter();
    out.write(json.toString());
}

============         在html上

             jQuery
                .ajax({
                    url : controllerUrl,
                    dataType : 'text',
                    processData : false,
                    contentType : false,
                    type : 'GET',
                    success : function(response) {
    success : function(response) {
                        marker = JSON.stringify(response);
                        json = jQuery.parseJSON(marker);
                        json = JSON.parse(json);
                        alert(json.status);
                        }
                });

供参考: https://rwehner.wordpress.com/2010/06/09/2-ways-to-create-json-response-for-ajax-request-in-spring3/