Как поддерживать JSONP с Spring MVC и несколькими типами ответов

У меня есть метод в контроллере, который будет возвращать HTML или JSON в зависимости от того, что было запрошено. Вот урезанный пример такого метода, смоделированный после информации о том, как сделать это, который я нашел вэтот вопрос:

<code>@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));
}
</code>

Я поместил JSONPObject в модель, потому что мне нужно, чтобы иметь возможность получить его из представления, которое отображается, если запрашивался HTML. Но это создает проблему при рендеринге JSON с обратным вызовом:

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

Как вы можете видеть, потому что я помещаю свои данные в слот «data» в модели, когда модель отображается как JSON, возникает такая дополнительная упаковка. То, что я ищу, это визуализированный JSON (технически JSONP), который будет выглядеть следующим образом:

<code>call({"data":{"foo":"bar"}})
</code>

Может кто-нибудь увидеть способ получить, где я пытаюсь пойти, не нарушая возможность вернуть представление, которое обращается к JSONPObject во время рендеринга?

Ответы на вопрос(2)

просто измените его в соответствии с вашими потребностями:

на стороне сервера:

@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>
Решение Вопроса

iew для моей конфигурации. Это представление имеет свойство, которое указывает ему найти единственный элемент на карте и извлечь его перед рендерингом. После установки этого свойства это теперь работает.

    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" >
                <property name="extractValueFromSingleKeyModel" value="true" />
            </bean>
        </list>
    </property>
 Jon Lorusso14 дек. 2012 г., 03:51
Я не совсем понимаю. extractValueFromSingleKeyModel не имеет ничего общего с jsonp, который требует, если я правильно понимаю, вызова функции в теле ответа. Это имя функции обычно передается на сервер в строке запроса (например, callback = foo).

Ваш ответ на вопрос