Spring 3.1, ответ JSON ModelAndView

Это мой первый пост. Прошу прощения за мой английский...

У меня проблема с postJSON и возвратом частичного представления с помощью ModelAndView.

Мой контроллер:

    @RequestMapping(method=RequestMethod.POST, value = "/addUrl.html")
public @ResponseBody ModelAndView addSubMenu(@RequestBody Menu menu) {
    ModelAndView mav = new ModelAndView(PathConfig.MENU_DIR + "show_url");

    int id = menuService.saveOrUpdateMenu(1, menu.getTitle(), menu.getUrl(), 4, "pl");
    mav.addObject("submenu", menuService.get(id));
    return mav;
}

Мой код ajax:

$("#menuUrl").submit(function(){
    var menu = $(this).serializeObject();

    $.ajax({
        type: "POST",
        url: config.resourcePath+"/addUrl.html",
        data: JSON.stringify(menu),
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        success: function(response){
            $( "#site" ).append(response);
        },
        error: function(e){
            alert("Server did not response.");
        }
    });

});

Но... у меня ошибка: Сервер не ответил...

Как я могу отобразить частичный вид с помощью json?

Спасибо.


person psalkowski    schedule 10.12.2012    source источник
comment
У вас есть сериализатор JSON в classpath, как у Джексона, и аннотация @RequestMapping имеет правильное значение URL-адреса — /addUrl.html?   -  person Lion    schedule 11.12.2012
comment
Я смущен. Вы хотите вернуть визуализированный HTML или модель данных JSON? Ваш сервер хотел бы сериализовать объект ModelAndView как строку JSON, а ваш код jQuery хочет добавить элемент HTML в DOM.   -  person Stefan    schedule 11.12.2012


Ответы (3)


Здесь есть несколько вещей, которые могут быть неправильными:

Указав заголовок Content-type для application/json, вы ожидаете обратного ответа json, однако, глядя на то, как вы обрабатываете ответ, похоже, что вы хотите, это html

если это html, который вы ищете в качестве ответа, удалите заголовок Content-Type из запроса, удалите аннотацию @ResponseBody из ответа ModelAndView, вместо этого просто верните представление, которое указывает на обычный jsp, который может создать ответ html, который вы ожидают..

@RequestMapping(method=RequestMethod.POST, value = "/addUrl.html")
public ModelAndView addSubMenu(@RequestBody Menu menu) {
...
}
person Biju Kunjummen    schedule 11.12.2012
comment
Это доставило бы HTML-код (контроллер формы, предоставленный моделью, представление, полученное из шаблона) клиенту. Это было бы моим пониманием частичного. Затем вам нужно будет указать JQuery ожидать HTML или Text, но не JSON. - person Stefan; 11.12.2012

Если вы хотите, чтобы json обновлял некоторые части страницы, не возвращайте ModelAndView, возвращайте строку, убедитесь, что у вас есть сериализатор json

    @RequestMapping(method=RequestMethod.POST, value = "/addUrl.html")
    public @ResponseBody String addSubMenu() {
         //yourvariable
         return yourvariable.toString();
    }
person pgardunoc    schedule 11.12.2012
comment
Это доставит все, что у вас есть в вашей переменной. Если вы хотите вернуть объект, рассмотрите возможность возврата объекта и позвольте Spring маршалировать его в JSON. Если вы хотите доставить некоторый код, отображаемый браузером, я бы делегировал рендеринг представления слою представления, используя ModelAndView (без аннотации ReponseBody) в качестве результата. - person Stefan; 11.12.2012
comment
Правда, он вернет String, если нужен объект, замените String своим объектом, и вы можете сериализовать его, например, с помощью библиотеки jackson. - person pgardunoc; 11.12.2012

$("#menuUrl").submit(function(){
    var obj = $(this).serializeObject();
    obj.parentId = getParentId(menuDivId);

    $.ajax({
        url: config.resourcePath+"/addUrl.html", 
        data : JSON.stringify(obj),
        contentType : 'application/json',
        type : 'POST',
        context: document.body,
    }).done(function(response) {
        $("#site").append(response);
    });

    return false;
});

И контроллер, возвращающий ModelAndView. Это работает.

person psalkowski    schedule 11.12.2012