web-dev-qa-db-fra.com

Spring MVC: Erreur 400 La requête envoyée par le client était syntaxiquement incorrecte

Cela semble être un problème commun. J'ai lu toutes les réponses données dans SO mais je ne pouvais pas le faire fonctionner.
J'essaie d'intégrer Spring MVC + Freemarker dans une application Web déjà existante. Cela fonctionne bien pour la demande GET et Freemarker Template lit l’objet Java fourni par Controller sans aucun problème.
Mais l'envoi du formulaire ne peut pas frapper la méthode du contrôleur. Enfin, j'ai fait fonctionner log4j. Voici l'erreur que je reçois:
Erreur

    HandlerMethod details: 
    Controller [application.entry.controller.UserController]
    Method [public void application.entry.controller.UserController.handleSave(Java.lang.String)]

    org.springframework.web.bind.MissingServletRequestParameterException: 
Required String parameter 'action' is not present


Freemarker:

<form method="POST" action="save.html">
  ------------
  <input type="submit" class="btnnew" name="saveWithoutValidation" value="Save Without Validation"></input>
  <input type="submit" class="btnnew" name="submit" value="Submit"></input>
</form>

la racine du contexte estPORTAL.
spring-servlet.xml

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
      <property name="cache" value="true"/>
      <property name="prefix" value=""/>
      <property name="suffix" value=".ftl"/>

web.xml

<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

Manette

@RequestMapping(value="/save", method=RequestMethod.POST)
    public void handleSave(@RequestParam String action){

        if( action.equals("submit") ){
            System.out.println("Damn! You clicked submit");
        }
        else if( action.equals("saveWithoutValidation") ){
           System.out.println("Sweet! You want no string attached.");
        }

    }

Pour les journaux, j'ai essayé d'ajouter log4j.logger.org.springframework.web=DEBUG à mon log4j.properties existant mais cela n'a pas fonctionné.

9
Himanshu Yadav

J'ai également eu ce problème et ma solution était différente, donc ajouter ici pour ceux qui ont un problème similaire.

Mon contrôleur avait:

@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @RequestParameter SetPassword setPassword) {
    ...
}

Le problème était que cela devrait être@ModelAttributepour l'objet, pas @RequestParameter. Le message d'erreur correspondant est identique à celui décrit dans votre question.

@RequestMapping(value = "/setPassword", method = RequestMethod.POST)
public String setPassword(Model model, @ModelAttribute SetPassword setPassword) {
    ...
}
11
Abby

Le @RequestParam String action suggère qu'il y a un paramètre présent dans la demande avec le nom action qui est absent dans votre formulaire. Vous devez soit:

  1. Soumettez un paramètre nommé valeur p. Ex. <input name="action" />
  2. Définissez le paramètre requis sur false dans le @RequestParam par exemple. @RequestParam(required=false)
12
Bart

Une autre cause possible est d'avoir un ordre incorrect d'attributs RequestMapping. 

Une méthode de gestionnaire @RequestMapping peut avoir une signature très flexible . Les arguments de méthode pris en charge et les valeurs de retour sont décrits dans le section suivante. La plupart des arguments peuvent être utilisés dans un ordre arbitraire avec la seule exception des arguments BindingResult . Ceci est décrit dans la section suivante.

Si vous faites défiler la doc, vous verrez que le BindingResult doit être placé immédiatement après l'attribut de modèle, car nous pouvons avoir plusieurs objets de modèle par demande et donc plusieurs liaisons.

Les paramètres Errors ou BindingResult doivent suivre l'objet de modèle c'est être lié immédiatement comme le pourrait la signature de la méthode plusieurs objets de modèle et Spring créera un fichier .__ séparé. Instance de BindingResult pour chacune d’elles afin que l’exemple suivant ne soit pas travail:

Voici deux exemples:

Commande non valide de BindingResult et @ModelAttribute. 

@RequestMapping (method = RequestMethod.POST) public String processSubmit (@ModelAttribute ("animal") Animal familier, Modèle, Résultat BindingResult) {...} Notez qu'il existe un paramètre Model dans entre Pet et BindingResult. Pour que cela fonctionne, vous devez réorganiser les paramètres comme suit:

@RequestMapping (method = RequestMethod.POST) public String processSubmit (@ModelAttribute ("animal") Animal domestique, Résultat BindingResult, Modèle) {...}

8
sashok_bg

J'étais confronté à un problème similaire et j'ai constaté que certains champs comme Date ne recevaient pas de valeur concrète, une fois que les valeurs fonctionnaient bien. Assurez-vous de ne pas avoir de date ou de tout autre champ présent sur le formulaire qui nécessite une valeur concrète. 

3
Viral Sejpal

Basé sur l'erreur:

Required String parameter 'action' is not present

Il doit exister un paramètre de requête nommé action dans la requête de Spring pour mapper la requête à votre gestionnaire handleSave.

Le code HTML que vous avez collé ne présente aucun paramètre de ce type.

1
Dave L.

Le contrôleur essaie de trouver la valeur "action" dans le bean mais, selon votre exemple, vous n'avez défini aucun nom de bean "action" . Essayez de faire name = "action" . @ RequestParam trouve toujours dans le bean classe.

1
karampal

Mon problème était le manque de paramètre BindingResult après mon attribut de modèle. 

 @RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded")
    public ModelAndView registerUser(@Valid @ModelAttribute UserRegistrationInfo userRegistrationInfo
                                HttpServletRequest httpRequest,
                                HttpSession httpSession) { ... } 

Après avoir ajouté BindingResult, mon contrôleur est devenu

@RequestMapping(method = RequestMethod.POST, value = "/sign-up", consumes = "application/x-www-form-urlencoded")
    public ModelAndView registerUser(@Valid @ModelAttribute  UserRegistrationInfo userRegistrationInfo, BindingResult bindingResult,
                                HttpServletRequest httpRequest,
                                HttpSession httpSession) { ..}

Vérifier la réponse @sashok_bg @ Sashko_bg Mersi mnogo

0
Adelin

S'il vous plaît garder votre 

<form method="POST" action="XYZ">


@RequestMapping(value="/XYZ", method=RequestMethod.POST)
    public void handleSave(@RequestParam String action){

La valeur de votre attribut d'action de formulaire doit correspondre à celle de @RequestMapping afin que Spring MVC puisse le résoudre.

En outre, comme vous l'avez dit, il donne 404 après avoir été modifié. Pour cela, pouvez-vous vérifier si le contrôle entre dans la méthode handleSave ().

Je pense que, comme vous ne retournez rien de la méthode handleSave (), vous devez le regarder.

si cela ne fonctionne toujours pas, pouvez-vous s'il vous plaît poster vos journaux de printemps.

En outre, assurez-vous que votre demande doit venir comme 

/ PORTAL/sauvegarder

s'il y a quelque chose entre comme PORTAL/jsp/enregistrer la mention dans @RequestMapping (valeur = "/ jsp/enregistrer")

0
Jayesh

Le mappage de votre demande est /save, mais votre POST doit être /save.html. Changer le POST en /save devrait résoudre le problème. 

0
Biju Kunjummen

@CookieValue (value = "abc", required = true) Chaîne m

quand j'ai changé requis de vrai à faux, cela a fonctionné.

0
Nitin