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.");
}
}
11 Réponses :
Votre demande de mappage est / Enregistrer code>, mais votre message est /save.html code>. Modification du POST / sauvegarde code> devrait fixer. p>
En fait, / Enregistrer code> m'a donné 404. J'ai essayé avec
S'il vous plaît garder votre
/PORTAL/save
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");}
Sur la base de l'erreur:
Required String parameter 'action' is not present
@RequestParam l'action Chaîne code> suggère qu'il existe un présent paramètre dans la requête avec le nom Action em> qui est absent dans votre formulaire. Vous devez soit: p>
code> li>
false code> dans le @RequestParam code> par exemple @RequestParam (obligatoire = false) code> li>
ol>
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) {
...
}
@ModelAttribute code> fonctionnera car il se lie également la demande à la cible annotée. @RequestParam code> est cependant un meilleur ajustement pour la fixation des paramètres de demande individuellement.
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. P>
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. p>
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?
@CookieValue(value="abc",required=true) String m when I changed required from true to false,it worked out.
Une autre cause possible est d'avoir le mauvais ordre des attributs RequestMapping. Comme le dit doc printemps: p>
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 strong>. Ceci est décrit dans la section suivante. p> blockQuote>
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 p>
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: p> blockQuote>
Voici deux exemples: p>
commande non valide de BindingResult et @ModelAttribute. p>
@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: p>
@RequestMapping (méthode = RequestMethod.POST) public String processSubmit (@ModelAttribute ( "pet") pet, résultat BindingResult, Modèle de modèle) {...} p> blockQuote>
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) { ..}
Ajout d'un paramètre BindingResult dans votre méthode. Pour renvoi, mon code ci-dessous. P>
save (employé @ModelAttribute employé, BindingResult bindingResult) code> p>