我的网站最终出现了问题。它使用 AJAX 请求从服务器获取数据,该服务器使用 Spring MVC 。
会发生什么(间歇),有时我们会遇到像这样的例外:
org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter 'page' is not present
at
这种异常发生在一些 AJAX POST 调用中(不仅仅是针对这种情况!!),我们仍然无法重现它以了解正在发生的事情。
例如,在其中一种情况下,参数“page”(用于在用户滚动页面时加载内容 - 因此它是必需变量)通过 AJAX 调用发送一个' data '字段,其中page参数来自如下形式:
<input type="hidden" name="page" id="page" value="1">
ajax调用就像这个( $(“#filter”)和 url 都可以):
$.ajax({
type: "POST",
data: $("#filter").serialize(), // serializes the form's elements.
url: _ctx + URL_FILTER,
cache: false
})
我们重现的唯一方法是将其属性“名称”更改为“ page ”以外的其他内容。但我想情况并非如此(大多数用户甚至都没有打开开发者控制台......)
我用Google搜索了很多内容,并检查了所有可能性。借口还可以:
(Content-Type: application/x-www-form-urlencoded; charset=UTF-8)
参数还可以,AJAX看起来不错,一切似乎都好......但是我们找不到发生了什么。我们已经尝试了很多可能性,但我们仍然不能强迫这些例外发生。
我们得到的一个假设是,有时AJAX可能会发送空数据块,而没有任何参数。但我们甚至不知道这是否真实,以及如何检查其真实性。
有什么可能性?怎么测试?
修改 我们可以重现一种获取异常的方法:重复重新加载页面几秒钟(按住重新加载键一段时间)。有没有办法防止这种情况的例外?!
答案 0 :(得分:1)
对页面参数的控制器类方法进行以下更改 @RequestParam(defaultValue = 0)int page。
或者在此粘贴控制器方法。
答案 1 :(得分:1)
如果您无法找出缺少参数的原因,那么您可以添加
public void controllerMethodName (@RequestParam(required = false) int page)
您的控制器定义中的代码,如果您的ajax请求中不存在参数,则不会抛出任何异常。
答案 2 :(得分:1)
您确定自己的表单未同时修改吗?例如,如果用于处理页面滚动的库尝试在很短的时间内发送相同的表单(第一个调用在第二个调用序列化时更新表单)。这可能只适用于某些浏览器,而不是所有浏览器,因为您无法轻松复制它。
数据放回表单的方式也可能是您的问题所在。
记录HTTP请求/使用分析可帮助您识别导致问题的请求/用户代理。