2012-04-25 49 views
3

我在控制器中有一个方法,它将根据请求的内容返回HTML或JSON。下面是这种方法的一个简化例子,我在this question发现如何做到这一点的信息后建模:如何使用Spring MVC和多种响应类型支持JSONP

@RequestMapping(value="callback") 
public ModelAndView callback(@RequestParam("c") String c) { 
    Map response = new HashMap<String, String>(); 
    response.put("foo", "bar"); 
    return new ModelAndView("fake", "data", new JSONPObject(c, response)); 
} 

我把JSONPObject到模型,因为我要为了能够达到它从呈现如果HTML被请求的视图。但是,这带来了,当我渲染JSON有一个回调的一个问题:正如你所看到的,因为我把我的数据在模型中的“数据”插槽,当模型被渲染为JSON有

curl 'http://localhost:8080/notes/callback.json?c=call' 
{"data"call(:{"foo":"bar"})} 

那额外的包装。我正在寻找的是呈现JSON(技术上JSONP)看起来像这样:

call({"data":{"foo":"bar"}}) 

任何人都可以看到一个办法让在那里我试图去不破坏返回访问视图的能力渲染过程中的JSONPObject?

回答

0

我明白了这一点。在渲染JSON时,Spring根据我的配置使用MappingJacksonJsonView。该视图有一个属性,告诉它在映射中查找单个项目并将其提取出来。设置该属性后,现在可以工作。

<property name="defaultViews"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" > 
       <property name="extractValueFromSingleKeyModel" value="true" /> 
      </bean> 
     </list> 
    </property> 
+1

我很困惑。 extractValueFromSingleKeyModel与jsonp没有任何关系,如果我理解正确,它需要响应正文中的函数调用。这个函数名通常传递给查询字符串上的服务器(例如callback = foo)。 – 2012-12-14 02:51:34

7

这是我如何使用JSONP与Spring MVC,只是根据自己的需要进行修改:

在服务器端:

@RequestMapping(value="/notes/callback.json", method=RequestMethod.GET) 
public void jsonpCallback(@RequestParam("callback") String callback, HttpServletResponse response) { 
    response.setContentType("text/javascript; charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    out.print(callback + "(" + jsonDataString + ")"); 
} 

在客户端:

<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script> 
<script type="text/javascript"> 

function yourfunction() { 
    jQuery.getJSON("http://localhost:8080/notes/callback.json?callback=?", 
     function(data) { 
      alert(data.someParam); 
     }); 
} 

</script> 
相关问题