9
votes

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

Cela semble être un problème commun. Je suis allé toutes les réponses données en SO mais n'a pas pu le faire fonctionner.
Je suis en train d'intégrer Spring MVC + Freemarker dans l'application web déjà existante. Il fonctionne très bien pour le GET code> demande et Freemarker modèle lit objet java fourni par le contrôleur sans aucun problème.
Mais le formulaire de soumission ne peut pas frapper la méthode du contrôleur. Enfin, je fait le travail de log4j. Voici l'erreur que je reçois:
Erreur strong>

@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.");
        }

    }


0 commentaires

11 Réponses :


0
votes

Votre demande de mappage est / Enregistrer , mais votre message est /save.html . Modification du POST / sauvegarde devrait fixer.


1 commentaires

En fait, / Enregistrer m'a donné 404. J'ai essayé avec mais la même erreur.



0
votes

S'il vous plaît garder votre

/PORTAL/save


5 commentaires

il serait utile que vous pouvez partager la cause de l'erreur, que les autres d'aide qui feront face à une erreur similaire.


J'ai ajouté l'exception à ma question. Mais ont aucune idée sur la façon de le résoudre.


Je pense exception est due à votre paramètre pris par la méthode handleSave (@RequestParam d'action String). il n'y a pas de carte trouvée sous forme de html pour le paramètre dans la méthode handleSave. essayez l'application runnning en changeant la méthode handleSave à handleSave () {// votre code}


D'ACCORD. Alors, comment pourrais-je obtenir toutes les valeurs de forme et qui se sont cliqués bouton?


d'une façon que vous pouvez faire est handleSave public void (demande HttpServletRequest) {String = data1 request.getParameter ( "your_html_element_name");}



1
votes

Sur la base de l'erreur:

Required String parameter 'action' is not present


0 commentaires

12
votes

@RequestParam l'action Chaîne suggère qu'il existe un présent paramètre dans la requête avec le nom Action qui est absent dans votre formulaire. Vous devez soit:

  1. Soumettre un paramètre appelé valeur par exemple
  2. Définissez le paramètre requis à false dans le @RequestParam par exemple @RequestParam (obligatoire = false)

0 commentaires

12
votes

J'ai aussi eu ce problème et ma solution était différente, afin d'ajouter ici pour tous ceux qui ont le même problème

Mon contrôleur avait. P>

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


1 commentaires

@ModelAttribute fonctionnera car il se lie également la demande à la cible annotée. @RequestParam est cependant un meilleur ajustement pour la fixation des paramètres de demande individuellement.



1
votes

Controller en essayant de trouver la valeur « actions » dans le haricot mais selon votre exemple, vous n'avez pas mis importe quel nom de haricot de « actions ». essayer de faire name = "action". @RequestParam trouve toujours dans la classe de haricots.


0 commentaires

3
votes

Je faisais face à un problème similaire et a constaté que quelques domaines comme la date ne bénéficiaient pas d'une valeur concrète, une fois donné les valeurs des choses a bien fonctionné. S'il vous plaît assurez-vous que vous n'avez pas la date ou tout autre champ présent sur la forme qui a besoin d'une valeur concrète.


1 commentaires

Tel était le problème pour moi. Je supposais Spring gérerait une valeur vide pour les champs de date, mais je suppose que non?



0
votes
@CookieValue(value="abc",required=true) String m
when I changed required from  true to false,it worked out.

0 commentaires

9
votes

Une autre cause possible est d'avoir le mauvais ordre des attributs RequestMapping. Comme le dit doc printemps:

Une méthode de gestionnaire @RequestMapping peut avoir une signature très souples. 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 immediatelly après l'attribut du modèle, puisque nous pouvons avoir plusieurs objets de modèle par demande et ainsi de multiples liaisons

Les erreurs ou les paramètres BindingResult doivent suivre l'objet modèle qui est lié immédiatement que la signature de la méthode peut avoir plus d'un objet de modèle et le printemps va créer une séparée par exemple BindingResult pour chacun d'eux si l'échantillon suivant ne sera pas travail:

Voici deux exemples:

commande non valide de BindingResult et @ModelAttribute.

@RequestMapping (méthode = RequestMethod.POST) public String processSubmit (@ModelAttribute ( "pet") Pet animal, modèle modèle, résultat BindingResult) {...} Notez qu'il existe un paramètre modèle dans entre animaux et BindingResult. Pour obtenir ce travail, vous devez réorganiser les paramètres comme suit:

@RequestMapping (méthode = RequestMethod.POST) public String processSubmit (@ModelAttribute ( "pet") pet, résultat BindingResult, Modèle de modèle) {...}


0 commentaires

1
votes

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

@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) { ..}


0 commentaires

0
votes

Ajout d'un paramètre BindingResult dans votre méthode. Pour renvoi, mon code ci-dessous.

save (employé @ModelAttribute employé, BindingResult bindingResult)


0 commentaires