如何将@RequestBody与JSONP请求一起使用?

由于集群环境中的跨域问题,我试图使用jsonp数据类型执行ajax请求。

我可以向没有@RequestBody参数映射的方法发出jsonp请求,但是当我尝试使用@RequestBody参数实现RequestMapping时,出现415不支持的媒体类型错误。

通常,当我遇到此问题时,是由于某些属性未正确在发布的json对象与其在Spring中映射到的Java对象之间正确映射。但是我能找到的唯一差异是,使用jsonp会添加一个名为callback的参数和一个带有下划线“

_”的参数。

所以我在我的Java对象中添加了标签@JsonIgnoreProperties(ignoreUnknown =

true),并认为应该可以解决该问题,但是仍然会引发此错误。

我还有什么需要做的吗?

编辑:我现在在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方法上有一个断点,它从未命中过。

回答:

JSONP意味着jQuery将创建一个指向您的控制器URL 的<script>元素src

如您所见,这种方法不允许您在请求正文中传递任何数据,所有数据都应作为查询参数在URL中传递。data : { abc : '123'

}表示abc=123已添加到URL。

在控制器端,您需要使用@RequestParam(绑定单个参数)或@ModelAttribute(将多个参数绑定到一个对象):

public ReturnObject getBlahBlah (@RequestParam("abc") int abc) throws Exception { ... }

以上是 如何将@RequestBody与JSONP请求一起使用? 的全部内容, 来源链接: utcz.com/qa/423393.html

回到顶部