2013-12-13 15 views
0

我正在嘗試開發一個簡單的組件,其工作是使用模板呈現數據的特定部分。Spring MVC - 使用POST和發送數據使用Ajax返回視圖

我使用的是彈簧數據REST的MVC所以我有一個適合我的需求(基於AJAX的web應用程序)的數據的準備和工作開箱即用的來源。

所以,我有什麼問題。 問題就出在這裏:

{ 
    "panels":[ 
    { 
     "id":"panel-BASIC", 
     "el":"panel-BASIC", 
     "attributes":[ 
     { 
      "position":"0", 
      "key":"id", 
      "display":"value", 
      "dataUtility":"", 
      "value":"2" 
     }, 
     { 
      "position":"1", 
      "key":"begin", 
      "display":"value", 
      "dataUtility":"", 
      "value":1384518600000 
     }, 
     { 
      "position":"2", 
      "key":"end", 
      "display":"value", 
      "dataUtility":"", 
      "value":1384518600000 
     }, 
     { 
      "position":"3", 
      "key":"interval", 
      "display":"value", 
      "dataUtility":"intervalCalculationDataUtility" 
     } 
     ] 
    }, 
    { 
     "id":"panel-ONE_TO_MANY", 
     "el":"panel-ONE_TO_MANY", 
     "attributes":[ 
     { 
      "position":"0", 
      "key":"tasks", 
      "display":"table", 
      "dataUtility":"", 
      "value":"http://localhost:8080/rest/appointment/2/tasks" 
     } 
     ] 
    }, 
    { 
     "id":"panel-MANY_TO_ONE", 
     "el":"panel-MANY_TO_ONE", 
     "attributes":[ 
     { 
      "position":"0", 
      "key":"car", 
      "display":"infopage", 
      "dataUtility":"", 
      "value":"http://localhost:8080/rest/appointment/2/car" 
     }, 
     { 
      "position":"1", 
      "key":"assignee", 
      "display":"infopage", 
      "dataUtility":"", 
      "value":"http://localhost:8080/rest/appointment/2/assignee" 
     }, 
     { 
      "position":"2", 
      "key":"reporter", 
      "display":"infopage", 
      "dataUtility":"", 
      "value":"http://localhost:8080/rest/appointment/2/reporter" 
     } 
     ] 
    } 
    ], 
    "container":"ip-SAppointment" 
} 

這是正在被髮送到服務器,以前建成使用檢索到的數據和屬性描述符的客戶端描述符。

使用我已經發布了一個JSON我需要發送POST請求與它不是返回渲染視圖。 控制器方法的工作是相當簡單:

@RequestMapping(
     value = "/template/render", 
     method = RequestMethod.POST, 
     produces = MediaType.TEXT_PLAIN_VALUE, 
     consumes = MediaType.APPLICATION_JSON_VALUE 
) 
public ModelAndView getInfoPageViewData(
     @RequestBody final InfoPageDescriptor body 
) { 
    LOGGER.trace(String.format("/getInfoPageViewData -> %s", body)); 
    final ModelMap modelMap = new ModelMap(); 
    modelMap.put("dd", body); 
    return new ModelAndView(DATA_VIEW_NAME, modelMap); 
} 

所以你可以看到它的包裝JSON發送到InfoPageDescriptor Bean上放置比爲ModelMap。

返回的視圖將處理來自模型映射的豆,並相應地起作用以條目。

無論如何,我可以得到這個方法的工作。通過這樣的jQuery的(AJAX-POST)電話:

function loadRenderedView(url, data, callback) { 
    return $.ajax({ 
     headers : { 
      'Accept'  : 'text/plain', 
      'Content-Type': 'application/json' 
     }, 
     url  : url, 
     data : JSON.stringify(data), 
     dataType: 'json', 
     type : 'post', 
     success : function (data) { 
      callback.apply(this, [data, true]); 
     }, 
     failure : function() { 
      callback.apply(this, [data, false]); 
     } 
    }); 
} 

我得到一個錯誤:客戶端發送的請求是語法不正確。

你能給我應該如何構建一個請求或控制器服務器的方法來使它工作的一些提示?

+1

添加「log4j.logger.org.springframework = INFO,yourlogger」你log4j.properties和檢查的痕跡,看來你是發送一個JSON不與InfoPageDescriptor類相匹配。 – vzamanillo

+0

好的,我會看看。 – kornicameister

+0

你救了我一天,這個小小的提示讓我發現了一個錯誤。事實上,我的JSON結構與Java結構不匹配。一個小的嵌套屬性具有不同的名稱。 Thx的幫助;) – kornicameister

回答

1

好的,將它作爲答案發布,因爲我需要在此處進行格式設置。

@vzamanillo,你的假設可能是正確的在這裏,因爲我已經檢查日誌並得到了這些例外:

2013-12-14 17:15:14 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotSupportedException: Invalid media type "json": does not contain '/' 
2013-12-14 17:15:14 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotSupportedException: Invalid media type "json": does not contain '/' 
2013-12-14 17:15:14 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotSupportedException: Invalid media type "json": does not contain '/' 

我認爲這可能是有關在該JSON發送的網址,所以我將調查。

1

添加

Log4j.logger.org.springframework = INFO,yourlogger

您log4j.properties和檢查的痕跡,看來你是發送一個JSON不與InfoPageDescriptor類相匹配。

編輯:

變化字符串化的數據類型爲「application/JSON」這可能解決此問題並更改接受Ajax請求的頭

「接受」:「應用/ JSON」,

+0

好吧,這可能是問題......無論如何,它現在是固定的,我能夠檢索json並在視圖中包含bean以根據模板和數據呈現它。 – kornicameister