Le paramètre Spring MVC – RequestParamException n'est pas présent

J'ai un problème qui se produit éventuellement sur mon site. Il utilise les requêtes AJAX pour obtenir des données du serveur, qui utilise Spring MVC .

Ce qui se passe ( par intermittence ) est que parfois nous avons eu une exception comme celle-ci:

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

Ce type d'exception se produit dans certains appels AJAX POST (non seulement pour ce cas!) Et nous ne pouvons toujours pas le reproduire pour comprendre ce qui se passe.

Par exemple, dans l'un des cas, le paramètre «page» (utilisé pour charger du contenu alors que l'utilisateur fait défiler la page – c'est une variable requise) est envoyé par un appel AJAX qui a un champ ' données ' avec le paramètre de page à venir D'une forme comme celle-ci:

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

Et un appel ajax comme celui-ci (les deux $ ("# filter") et l' URL sont ok):

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

La seule façon de reproduire, c'est en changeant son «nom» de propriété à autre chose que « page ». Mais je suppose que ce n'est pas le cas (la plupart des utilisateurs n'ouvrent même pas la console du développeur …)

J'ai beaucoup googlé et j'ai vérifié toutes les possibilités. La rencontre est ok:

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

Les paramètres sont corrects, l'AJAX semble correct, tout semble correct … Mais nous ne pouvons pas trouver ce qui se passe. Nous avons essayé beaucoup de possibilités, mais nous ne pouvions toujours pas forcer ces exceptions à se produire.

Une hypothèse que nous avons est que parfois l'AJAX peut envoyer des blocs de données vides, sans aucun des paramètres. Mais nous ne savons même pas si c'est vrai ou non et comment vérifier sa véracité.

Quelles sont les possibilités? Comment peut-il être testé?

EDIT: Nous pourrions reproduire une des façons d'obtenir l'exception: Recharger la page à plusieurs reprises pendant quelques secondes (en maintenant la touche de rechargement enfoncée pendant un certain temps). Existe-t-il un moyen d'éviter l'exception pour ce cas?

Effectuez la modification ci-dessous à la méthode de classe du contrôleur pour le paramètre de page @RequestParam (defaultValue = 0) int page.

Ou collez la méthode du contrôleur ici.

Si vous n'êtes pas en mesure de comprendre quelle est la raison derrière le paramètre manquant, vous pouvez donc ajouter

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

Code dans la définition de votre contrôleur qui ne jettera aucune exception si le paramètre n'est pas présent dans votre demande ajax.

Êtes-vous sûr que votre formulaire n'est pas modifié en même temps? Par exemple, si votre bibliothèque utilisée pour gérer le défilement de la page essaie d'envoyer le même formulaire en très peu de temps (le premier appel met à jour le formulaire pendant que le deuxième appel le sérialise). Cela pourrait être seulement sur certains navigateurs, pas tous, étant donné que vous ne pouvez pas le reproduire facilement.

La façon dont les données sont remises dans le formulaire peut également être responsable de votre problème.

L'enregistrement des requêtes HTTP / l'utilisation d'une analyse vous aidera à identifier les requêtes / agents utilisateurs qui causent des problèmes.