Spring MVC - RequestParamException 参数不存在
Posted
技术标签:
【中文标题】Spring MVC - RequestParamException 参数不存在【英文标题】:Spring MVC - RequestParamException parameter is not present 【发布时间】:2016-01-02 14:18:32 【问题描述】:我的网站最终出现了一个问题。它使用 AJAX 请求从服务器获取数据,该服务器使用 Spring MVC。
会发生什么(间歇性)有时我们会遇到这样的异常:
org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter 'page' is not present
at
这种异常发生在一些 AJAX POST 调用中(不仅仅是这种情况!!),我们仍然无法重现它以了解发生了什么。
例如,在其中一种情况下,参数“page”(用于在用户滚动页面时加载内容 - 因此它是必需的变量)是通过 AJAX 调用发送的,该调用具有一个“数据”字段,其页面参数来自这样的表单:
<input type="hidden" name="page" id="page" value="1">
还有一个 ajax 调用 like 这个($("#filter") 和 url 都可以):
$.ajax(
type: "POST",
data: $("#filter").serialize(), // serializes the form's elements.
url: _ctx + URL_FILTER,
cache: false
)
我们重现它的唯一方法是将其属性“名称”更改为“page”以外的其他内容。但我想情况并非如此(大多数用户甚至不打开开发者控制台......)
我用谷歌搜索了很多,我检查了每一种可能性。结尾没问题:
(Content-Type: application/x-www-form-urlencoded; charset=UTF-8)
参数没问题,AJAX 看起来没问题,一切似乎没问题……但是我们找不到发生了什么。我们尝试了很多可能性,但仍然无法强制这些异常发生。
我们的一个假设是,有时 AJAX 可能会发送空数据块,而没有任何参数。但我们甚至不知道它是真是假,也不知道如何验证它的真实性。
有哪些可能性?如何测试?
编辑: 我们可以重现获得异常的一种方法:重复重新加载页面几秒钟(按住重新加载键一段时间)。有没有办法防止这种情况发生异常?!
【问题讨论】:
你能记录下服务器收到的HTTP请求吗?它可能有助于诊断问题。 你能展示你是如何在控制器中定义你的方法的吗,在我看来你把参数页面设置为强制性的 @Sudakatux 参数必须是强制的,这就是问题所在!每次执行 AJAX 调用时它都应该在那里。 Gaël 我不确定。我应该如何记录服务器上收到的 HTTP 请求?问题是我不知道我是否可以为每个 HTTP 请求(例如,来自这个特定的 ajax 调用)生成一个日志文件,因为它每小时会有 100.000 个条目......而且可能只有 0.001% 会给出我是个例外 对于这样的情况,我建议捕获前端错误并将它们发送到分析或类似的东西。你可以有各种拦截器。 粘贴您的controller
代码。
【参考方案1】:
对控制器的页面参数的类方法进行以下更改 @RequestParam(defaultValue = 0) int 页面。
或者在这里粘贴控制器方法。
【讨论】:
是的,我知道,但实际上这个参数必须按预期工作......而且方法“很好”,当我们尝试测试它时它总是有效,但问题是有时某些用户会遇到引发异常的问题。【参考方案2】:如果您无法弄清楚缺少参数的原因,那么您可以添加
public void controllerMethodName (@RequestParam(required = false) int page)
如果您的 ajax 请求中不存在参数,则控制器定义中的代码不会引发任何异常。
【讨论】:
是的,我知道,但实际上这个参数必须按预期工作......而且方法“很好”,当我们尝试测试它时它总是有效,但问题是有时某些用户会遇到引发异常的问题。【参考方案3】:您确定您的表单没有同时被修改吗?例如,如果您用于处理页面滚动的库尝试在很短的时间内发送相同的表单(第一次调用更新表单,而第二次调用正在序列化它)。这可能只在某些浏览器上,而不是在所有浏览器上,因为您无法轻松重现它。
将数据放回表单的方式也可能导致您的问题。
记录 HTTP 请求/使用分析将帮助您确定哪些请求/用户代理导致问题。
【讨论】:
以上是关于Spring MVC - RequestParamException 参数不存在的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC 中的@RequestParam 处理可选参数
Spring MVC:复杂对象作为 GET @RequestParam
Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解