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 等详解

如何使用 Spring MVC @RequestParam 解析不同的 ISO 日期/时间格式

Spring MVC 的@RequestParam注解和request.getParameter("XXX")