Java 如何将@RequestBody与JSONP请求一起使用?
由于集群环境中的跨域问题,我尝试使用jsonp数据类型执行ajax请求 我可以向不使用@RequestBody参数映射的方法发出jsonp请求,但是当我尝试使用@RequestBody参数实现RequestMapping时,我得到了415个不受支持的媒体类型错误 通常,当我遇到这个问题时,是由于一些属性在发布的json对象和它在Spring中映射到的Java对象之间没有正确映射。但我能找到的唯一区别是,使用jsonp它添加了一个名为callback的parm和一个名为下划线“\ux”的parm 因此,我将标记@JsonIgnoreProperties(ignoreUnknown=true)添加到我的Java对象中,并认为应该解决这个问题,但它仍然抛出这个错误 还有什么我需要做的吗 编辑:我现在在Spring的调试日志输出中看到这个堆栈跟踪: org.springframework.web.HttpMediaTypeNotSupportedException:不支持内容类型“应用程序/八位字节流”Java 如何将@RequestBody与JSONP请求一起使用?,java,ajax,spring-mvc,jsonp,spring-3,Java,Ajax,Spring Mvc,Jsonp,Spring 3,由于集群环境中的跨域问题,我尝试使用jsonp数据类型执行ajax请求 我可以向不使用@RequestBody参数映射的方法发出jsonp请求,但是当我尝试使用@RequestBody参数实现RequestMapping时,我得到了415个不受支持的媒体类型错误 通常,当我遇到这个问题时,是由于一些属性在发布的json对象和它在Spring中映射到的Java对象之间没有正确映射。但我能找到的唯一区别是,使用jsonp它添加了一个名为callback的parm和一个名为下划线“\ux”的parm
$.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));
}
});
弹簧控制器是:
@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
}
我在控制器方法上有一个从未命中的断点。JSONP意味着jQuery将创建一个
元素,其中src
指向您的控制器URL
正如您所看到的,这种方法不允许您在请求体中传递任何数据,所有数据都应该作为查询参数在URL中传递<代码>数据:{abc:'123'}表示将abc=123
添加到URL
在控制器端,您需要使用@RequestParam
(绑定单个参数)或@modeldattribute
(将多个参数绑定到一个对象中):
谢谢你的澄清!我怀疑是这样的。。。好的,我会相应地更改它(从未使用ModelAttribute将多个PARM分组到一个对象中,但这正是我需要的)。我唯一担心的是,由于查询字符串长度限制(255个字符?),我会遇到许多PARM的问题。或者我可以将POST方法类型用于jsonp?jsonp是GET only-POST是不可能的。您可以编写一个代理控制器来实现这一点(AJAX通过POST调用应用程序中的控制器,然后POST将请求转发到外部URI,并将响应转发回应用程序)。
public ReturnObject getBlahBlah (@RequestParam("abc") int abc) throws Exception { ... }