2012-04-25 84 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>