2

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

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

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

所以我将标签 @JsonIgnoreProperties(ignoreUnknown = true) 添加到我的 Java 对象中,并认为应该可以解决这个问题,但是它仍然抛出这个错误。

还有什么我需要做的吗?

编辑:我现在在 Spring 的调试日志输出中看到此堆栈跟踪: org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported

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

我在 Controller 方法上有一个断点,它永远不会被命中。

4

1 回答 1

5

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

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

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

public ReturnObject getBlahBlah (@RequestParam("abc") int abc) throws Exception { ... }
于 2013-08-18T20:35:20.500 回答