Как отобразить представление / ответ JSON через AJAX, используя контроллер на основе аннотаций Spring MVC для портлетов? - PullRequest
5 голосов
/ 26 апреля 2011

Последние шесть часов я потратил на поиски Google и stackoverflow для ответа на этот вопрос.Изначально я являюсь разработчиком PHP, так что терпите меня - вернуть массив JSON из контроллера PHP тривиально.

Я использую Spring MVC 3.0 и просто хочу вернуть JSON-объект обратно в некоторый Javascript из моего Spring MVC Controller.Кажется, что в настоящее время нет простого способа сделать это с помощью портлета (https://jira.springsource.org/browse/SPR-7344). Решения, которые я видел, предлагают создать еще один DispatcherServlet, который обслуживает ответы JSON, но я пока не нашел хорошо документированный пример этого. Если кто-то знаетхороший способ сделать это (желательно с аннотациями), пожалуйста, скажите!

Ответы [ 5 ]

6 голосов
/ 27 апреля 2011

В итоге я нашел обходной путь для возврата "JSON" из контроллера портлета Spring MVC.Вот как я это сделал.

В моем контроллере:

@ResourceMapping("ajaxTest")
public void ajaxHandler(ResourceRequest request, ResourceResponse response)
        throws IOException {
    OutputStream outStream = response.getPortletOutputStream();
    StringBuffer buffer = new StringBuffer();

    Map<String, String> testMap = new HashMap<String, String>();
    testMap.put("foo", "bar");

    String test = new JSONObject(testMap).toString();
    buffer.append(test);

    outStream.write(buffer.toString().getBytes());
}

В "view.jsp":

<portlet:resourceURL var="ajaxtest" id="ajaxTest"/>

<script type="text/javascript">
  $.get('<%= ajaxtest %>', function(response) {
    var json = eval('(' + response + ')');
  });
</script>

Поскольку аннотация @ResourceMapping в настоящее время неПоддерживая возвращение JSON, я просто использовал org.json.JSONObject, чтобы преобразовать мою карту в объект JSON, а затем возвратил toString () этого объекта.Значение @ResourceMapping должно соответствовать идентификатору resourceURL.Использование eval для преобразования строки JSON в Javascript представляет угрозу безопасности, но я просто включил его, потому что это самый простой пример.Если вы беспокоитесь о безопасности, используйте JSON-анализатор.

3 голосов
/ 18 декабря 2011

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/ не применяется к портлетам в настоящее время.Смотри: https://jira.springsource.org/browse/SPR-7344

2 голосов
/ 23 декабря 2011

Мне удалось заставить его работать в Spring 3.0.5 с двумя простыми модификациями:

  • Реализация пользовательского WebArgumentResolver для анализа объекта из JSON из тела ResourceRequest
  • Возвращение MappingJacksonJsonView из метода моего контроллера.

Доступно только в Spring 3.1 - вы можете использовать setExtractValueFromSingleKeyModel в вашем MappingJacksonJsonView

Если кто-то интересуется, я могу опубликовать код Java

0 голосов
/ 18 июля 2017

Разработка @alex ответа:

    @ResourceMapping(value = "showJson")
    public ModelAndView showJson(ResourceRequest request) {
    ModelAndView mav = new ModelAndView(new 
                                   MappingJacksonJsonView());
    mav.addObject("key", myBeanToBeSerializedAsJson);
    return mav;
    }
0 голосов
/ 19 июля 2011

Начиная с Spring 3, контроллер автоматически преобразует в json, если используется ajax get / post с типом приложения json (т.е. .getJSON и .postJSON в jQuery). Эта функциональность одинакова для вариаций сервлетов и портлетов Spring MVC.

Вот сообщение в блоге, объясняющее это.

http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

...