2015-10-05 62 views
14

我有一個問題,最終發生在我的網站。它使用AJAX請求從服務器獲取數據,該服務器使用Spring MVCSpring MVC - RequestParamException參數不存在

會發生什麼(間歇)是,有時我們得到這樣一個例外:

org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter 'page' is not present 
at 

這種異常在一些AJAX POST通話時(不只是對於這種情況!)我們仍然無法重現它來了解發生的事情。

例如,在的情況下,參數「頁」一(用於加載而用戶滾動內容的頁面 - 所以這是一個所需的變量)被通過AJAX呼叫具有「數據發送「與頁面參數從表單來的這樣的領域:

<input type="hidden" name="page" id="page" value="1"> 

而一個Ajax調用這一個(兩個$( 」#過濾器「)網址都OK):

$.ajax({ 
    type: "POST", 
    data: $("#filter").serialize(), // serializes the form's elements. 
    url: _ctx + URL_FILTER, 
    cache: false 
}) 

我們得到了重現的唯一方法是通過改變其屬性「名稱」比「頁」以外的東西。但我想這不是這種情況(大多數用戶甚至不打開開發者控制檯...)

我已經GOOGLE了很多,我檢查了每一種可能性。該enconding是確定的:

(Content-Type: application/x-www-form-urlencoded; charset=UTF-8) 

的參數確定,AJAX看起來不錯,一切似乎都OK了...但是我們找不到是怎麼回事。我們嘗試了很多可能性,但我們仍然無法強制這些例外發生。

我們的一個假設是,有時AJAX可能會發送空數據塊,而沒有任何參數。但我們甚至不知道它是否屬實,以及如何檢查其準確性。

有什麼可能性?如何進行測試?

編輯: 我們可以複製的方法來獲得一個例外:反覆重新加載網頁幾秒鐘(按下了一陣重裝鍵)。有沒有辦法來防止這種情況下的例外?

+2

你能記錄在服務器上收到的HTTP請求嗎?它可能有助於診斷問題。 –

+0

你可以顯示你如何在控制器中定義你的方法,在我看來你是把參數頁作爲強制性的 – jstuartmilne

+0

@Sudakatux參數**有**是強制性的,這就是問題所在!每次執行AJAX調用時,它都應該在那裏。蓋爾我不確定。我應該如何記錄服務器上收到的HTTP請求?問題是我不知道我是否可以爲每個HTTP請求生成一個日誌文件(例如來自這個特定的Ajax調用),因爲它每小時會有100.000個條目......而且可能只有0.001%我是一個例外 –

回答

1

對頁面參數 @RequestParam(defaultValue = 0)int頁進行控制器類方法的以下更改。

或者在此粘貼控制器方法。

+0

是的,我知道,但實際上這個參數必須按預期工作......而且這種方法「很好」,當我們嘗試測試時它總是有效,但問題是某些用戶遇到問題拋出所描述的異常。 –

1

如果你沒能弄清楚什麼是背後的原因缺少的參數,這樣你就可以在你的控制器定義,也不會引發任何異常增加

public void controllerMethodName (@RequestParam(required = false) int page) 

代碼,如果參數不存在於你的Ajax請求。

+0

是的,我知道,但實際上這個參數必須按照預期的方式工作......並且這種方法「很好」,當我們嘗試測試時它總是有效,但問題在於某些用戶遇到問題拋出所描述的異常。 –

1

您確定您的表單沒有被同時修改嗎?例如,如果用於處理頁面滾動的庫嘗試在很短的時間內發送相同的表單(第一個調用在第二個調用將其序列化時更新表單)。這可能只在某些瀏覽器上,而不是所有的瀏覽器上,因爲你不能輕易再現它。

將數據放回表單的方式也可能會導致您的問題。

記錄HTTP請求/使用分析可幫助您確定哪些請求/用戶代理正在引發問題。