我正在尝试使用jsonp数据类型执行ajax请求,因为群集环境中存在跨域问题。
我可以对没有@RequestBody参数映射的方法发出jsonp请求,但是当我尝试使用@RequestBody参数实现RequestMapping时,我得到415不支持的媒体类型错误。
通常当我遇到这个问题时,由于某些属性在发布的json对象和它在Spring中映射到的Java对象之间没有正确映射。但我能找到的唯一不同之处是使用jsonp它会添加一个名为callback的parm和一个名为下划线“_”的parm
所以我将标签@JsonIgnoreProperties(ignoreUnknown = true)添加到我的Java对象中并认为应该解决这个问题,但它仍然会抛出此错误。
还有什么我需要做的吗?
编辑:我现在在Spring的调试日志输出中看到这个堆栈跟踪: org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型'application / octet-stream'
$.ajax({
url : 'http://blah/blah.html',
data : { abc : '123' }, (I also tried to JSON.stringify the object but no difference)
dataType : 'jsonp',
success : function(response) {
alert('ok '+JSON.stringify(response));
},
fail : function(response) {
alert('error'+JSON.stringify(response));
}
});
Spring控制器是:
@RequestMapping({ "blah/blah" })
@ResponseBody
public ReturnObject getBlahBlah (@RequestBody MyObject obj) throws Exception {
}
参数对象是:
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyObject {
private String abc;
// getter and setter for abc auto generated by MyEclipse
}
我在Controller方法上有一个永不被击中的断点。
答案 0 :(得分:4)
JSONP意味着jQuery将创建一个<script>
元素,src
指向您的控制器URL。
如您所见,此方法不允许您在请求正文中传递任何数据,所有数据都应作为查询参数在URL中传递。 data : { abc : '123' }
表示abc=123
已添加到网址中。
在控制器端,您需要使用@RequestParam
(以绑定个人参数)或@ModelAttribute
(将多个参数绑定到对象中):
public ReturnObject getBlahBlah (@RequestParam("abc") int abc) throws Exception { ... }