2012-04-25 7 views
3

質問に応じてHTMLまたはJSONを返すコントローラ内のメソッドがあります。私が到達できるようにするためにしなければならないので、私はモデルにJSONPObjectを入れ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)); 
} 

:ここでは、そのような方法の削ぎ落とした例、私はthis questionで見つけ、これを行う方法に関する情報をモデルにしたのですHTMLが要求された場合にレンダリングするビューから取得します。

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

あなたが見ることができるように、私はモデルをJSONとしてレンダリングされたモデルで、「データ」スロットに私のデータを入れているので、あります。しかし、これは私がコールバックでJSONをレンダリングしています問題を提起しますその余分なラッピング。誰もがアクセスするビューを返す機能を壊すことなく、私は行くことにしようとしている場所を取得する方法を見ることができます

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

:私が探しているレンダリングJSON(技術的にJSONP)はこのように見えることですレンダリング中の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)。 –

7

私はちょうどあなたのニーズに応じて変更し、春のMVCでJSONPを使用していますどのようにこれは、次のとおりです。サーバー側で

@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> 
関連する問題