我有这样的jQuery ajax调用:

            $.ajax({
            type: "post",
            url: url,
            data: JSON.stringify(formSubmit),
            contentType: "application/json",
            dataType: "json",
            success: function(xhr,status) {
                console.log("Return Data:"+xhr.responseText)
            });


我的控制器如下所示:

@RequestMapping(value = "/doIt", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public MyObject activityPerformed(HttpServletRequest request, HttpServletResponse response,  @RequestBody String jsonData) {
    logger.debug("JSON INPUT:"+jsonData);
    MyObject o = new MyObject("STUFF");
    return o;
}


这将引发406错误。我可以在浏览器中看到响应头中包含以下内容:

Content-Type:"text/html;charset=utf-8"


我认为映射的产生部分应该已修复。

当我删除ajax调用的“ contentType”时,我没有得到406错误,但是在URLEncoded中却得到了jsonData参数。不,我认为我可以解码,但是我认为那不是“正确的”。

那么,如何在ajax调用中将非URL编码的JSON发送给没有contentType:“ application / json”的控制器?

或如何设置控制器响应的contentType?

最佳答案

Spring是负责发送406的一方。The Spring reference documentationJavaDoc将有助于对此有所了解。

从参考文档中:


  [关于Produces字段]仅当Accept request标头匹配这些值之一时,该请求才会被匹配。


如果将正确的Accept request header (sec 14.1)(application / json的值; charset = UTF-8值)添加到ajax请求中,我希望您不再获得406 HTTP状态代码。

10-06 00:08