SpringMVC返回jsonp的问题

时间:2022-12-18 09:24:28

项目采用springMVC作为控制层,有一个请求用来返回jsonp的数据。代码大致内容如下:

@RequestMapping(value = LoginUrlUtil.LOGINJSON)
@ResponseBody
public Object loginjsonp (String my_username, String my_password, String callbackJsonp, HttpServletResponse response, HttpServletRequest request) {
           
      JSONObject jsonObject = new JSONObject();
      makeResult(jsonObject);
      return callbackJsonp + "(" + jsonObject.toJSONString() + ")";
}
可是在页面进行ajax的jsonp调用时,却不进入success方法,打印错误信息,发现有异常: XXX was not called。也就是说返回的数据的格式是有问题的。

但是换为PrintWriter向页面输出却没有问题,代码如下:

@RequestMapping(value = LoginUrlUtil.LOGINJSON)
@ResponseBody
public Object loginjsonp (String my_username, String my_password, String callbackJsonp, HttpServletResponse response, HttpServletRequest request) {
           
      JSONObject jsonObject = new JSONObject();
      makeResult(jsonObject);
           
      response.getWriter().write(callbackJsonp + "(" + jsonObject.toJSONString() + ")");
      return null;
}
在浏览器中直接访问该请求,发现采用return的返回结果,页面输出的是以下形式的:

"callbackJsonp({\"jumpTo\":\"http://www.XXXX.com/\",\"result\":\"success\",\"userId\":1,\"memberId\":2})"

而采用PrintWriter页面输出形式如下:

callbackJsonp({"jumpTo":"http://www.XXXX.com/","result":"success","userId":1,"memberId":2})

而这两种情况的不同出现的原因和为什么第一种页面出现异常的原因我不得而知。但是既然用了springMVC,还是喜欢采用ResponseBody注解,返回对象这种看起来优雅的形式。于是继续寻找解决方法,后来发现,采用com.fasterxml.jackson.databind.util.JSONPObject可以实现,代码如下:

@RequestMapping(value = LoginUrlUtil.LOGINJSON)
@ResponseBody
public Object loginjsonp (String my_username, String my_password, String callbackJsonp, HttpServletResponse response, HttpServletRequest request) {
           
      JSONObject jsonObject = new JSONObject();
      makeResult(jsonObject);
           
      JSONPObject jpo = new JSONPObject(callbackJsonp, jsonObject);
      return jpo;
}