2013-08-18 46 views
2

我尝试使用jsonp数据类型执行ajax请求,这是由于跨群集环境中的域问题导致的。如何通过JSONP请求使用@RequestBody?

我可以对没有@RequestBody参数映射的方法发出jsonp请求,但是当我尝试使用@RequestBody参数实现RequestMapping时,我得到一个415 Unsupported Media Type错误。

通常当我得到这个问题时,它是由于某些属性在json对象发布和它映射到Spring的Java对象之间没有正确映射。但我能找到的惟一差异是使用jsonp它添加了一个名为callback的parm,并且一个名称为下划线“_”

因此,我将标记@JsonIgnoreProperties(ignoreUnknown = true)添加到了我的Java对象并计算那应该可以解决这个问题,但是它仍然会抛出这个错误。

还有什么我需要做的吗?

编辑:我现在看到的调试日志输出该堆栈跟踪从春: org.springframework.web.HttpMediaTypeNotSupportedException:内容类型“应用程序/八位字节流”不支持

$.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 
} 

我有一个从未命中的控制器方法的断点。

回答

4

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

正如您所看到的,这种方法不允许您传递请求正文中的任何数据,所有数据都应作为查询参数传递到URL中。 data : { abc : '123' }表示abc=123已添加到URL中。

在控制器端,你需要为使用@RequestParam(绑定inidividual参数)或@ModelAttribute(绑定多个参数为对象):

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

谢谢你的澄清!我怀疑它是这样的...好的,我会相应地改变它(从未使用ModelAttribute将多个参数组合到一个对象中,但那就是我将需要的)。我唯一的担心是,由于查询字符串长度限制(255个字符?),我会遇到许多parms问题。或者我可以使用POST方法类型与jsonp? – Trant

+1

JSONP仅GET - POST是不可能的。你可以编写一个代理控制器来完成这个任务(你的AJAX通过POST调用应用程序中的控制器,然后将请求转发给外部URI,然后将请求转发回你的应用程序)。 – nickdos