2012-12-10 4 views
1

이것은 첫 번째 게시물입니다. 내 영어로 죄송합니다.스프링 3.1, JSON 응답 ModelAndView

ModelAndView로 postJSON 및 부분 뷰를 반환하는 데 문제가 있습니다.

내 컨트롤러 :

@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; 
} 

내 아약스 코드 :

$("#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과?

감사합니다.

당신이 당신이 무엇처럼 보이는 응답을 처리하는 그러나 방법을보고, 다시 JSON의 응답을 기대 application/jsonContent-type 헤더를 지정함으로써 :

+1

* classpath *에 Jackson과 같은 JSON 시리얼 라이저가 있고'@ RequestMapping' 주석의 URL 값이 올바르지 않습니다 -/addUrl.html'? – Lion

+0

혼란 스럽습니다. 렌더링 된 HTML 또는 JSON 데이터 모델을 반환 하시겠습니까? 서버가 ModelAndView 객체를 JSON 문자열로 serialize하려고하고 jQuery 코드가 HTML 요소를 DOM에 추가하려고합니다. – Stefan

답변

0
$("#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를 반환합니다. 작동 중입니다.

0

여기에서 잘못 될 수있는 몇 가지가있다 원하는은 당신이 응답이 그 요청에서 Content-Type 헤더를 제거 할 때 찾고있는 HTML 인 경우, 대신 일반 JSP를 가리키는보기를 반환 ModelAndView 응답에서 @ResponseBody 주석을 제거하는 HTML

입니다 당신이 기대하는 html 응답을 만들 수 있습니다 ..

@RequestMapping(method=RequestMethod.POST, value = "/addUrl.html") 
public ModelAndView addSubMenu(@RequestBody Menu menu) { 
... 
} 
+0

이렇게하면 HTML 코드 (모델에서 제공 한 양식 컨트롤러, 템플릿에서 전달 된보기)가 클라이언트에 전달됩니다. 이것은 부분적인 것에 대한 나의 이해 일 것이다. 그렇다면 JSON이 아닌 HTML이나 Text를 기대하도록 JQuery에 지시해야합니다. – Stefan

0

당신이 원하는 것은 문자열을 반환하는의 ModelAndView를 반환하지 않는 페이지의 일부를 업데이트 할 JSON의 경우는, JSON 시리얼

@RequestMapping(method=RequestMethod.POST, value = "/addUrl.html") 
    public @ResponseBody String addSubMenu() { 
     //yourvariable 
     return yourvariable.toString(); 
    } 
+0

이것은 당신이 당신의 변함없는 것을 제공 할 것입니다. 객체를 반환하려면 객체를 반환하고 Spring에서 JSON으로 마샬링하도록합니다. 일부 브라우저 렌더링 가능 코드를 전달하려면 ModelAndView (ReponseBody Annotation없이)를 사용하여 View 레이어에 뷰 렌더링을 위임합니다. – Stefan

+0

사실, 객체가 필요하면 String을 반환하고 String은 객체로 대체합니다. 예를 들어 jackson 라이브러리를 사용하여 직렬화 할 수 있습니다. – pgardunoc