web-dev-qa-db-fra.com

Spring MVC - Plusieurs boutons de soumission à un formulaire

J'essaie d'avoir 2 boutons de soumission postés dans un formulaire, chaque action de bouton étant mappée à différents contrôleurs. Voici mes mappings

@RequestMapping(value="/save", method=RequestMethod.POST, params="save")
@RequestMapping(value="/save", method=RequestMethod.POST, params="renew")

Et mes boutons d'envoi ressemblent à ceux-ci -

<input type="submit" name="save" class="button" value="Save" />
<input type="submit" name="renew" class="button" value="Renew" />

Comme vous pouvez le voir dans ma cartographie, je compte sur l'utilisation de paramètres pour différencier le bouton sur lequel vous avez cliqué. Le problème est que cela fonctionne 90% du temps mais parfois j'obtiens l'exception ci-dessous -

Java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8090/myapp/save': {public Java.lang.String com.myapp.SaveController.save(MyEntity,javax.servlet.http.HttpSession), public Java.lang.String com.myapp.SaveController.saveAndRenew(MyEntity,javax.servlet.http.HttpSession)}
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.Java:248)
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.Java:194)

Étrangement, lorsque cela se produit et que je soumets à nouveau la page, tout fonctionne bien par la suite. Existe-t-il une meilleure façon de réaliser ce que j'essaie de faire?

Merci!

38
user558122

si le formulaire a ces boutons spécifiés:

input type="submit" class="button" name="save" value="Save"
input type="submit" class="button" name="delete" value="Delete"
input type="submit" class="button" name="cancel" value="Cancel"

vous pouvez diriger vers une demande d'url différente selon le bouton enfoncé avec un contrôleur.

pour le bouton d'annulation,

@RequestMapping(params = "cancel", method = RequestMethod.POST)
public String cancelUpdateUser(HttpServletRequest request) {
    return "redirect:/users.html";
}

ce que fait le mappage de requête, c'est d'analyser la post-requête si elle contient params nom = annuler.

pour le bouton de sauvegarde,

@RequestMapping(params = "save", method = RequestMethod.POST)
public String saveUser(HttpServletRequest request, @ModelAttribute User user, BindingResult result, SessionStatus status) {
    // validate your result
    // if no errors, save it and redirect to successView.
}
38
xyzlast

Pourquoi pas:

<input type="submit" name="action" value="save" />

et alors:

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

    if( action.equals("save") ){
       //handle save
    }
    else if( action.equals("renew") ){
       //handle renew
    }

} 
33
Dan

Si vous disposez de plusieurs méthodes de contrôleur avec le même @RequestMapping qui ne diffère que par l'attribut params, Vous devez écrire explicitement:

  • quel paramètre est censé être présent dans la demande, par ex. params="save"
  • quel paramètre n'est PAS censé être présent dans la demande, par ex. params="!save"

Dans ton cas:

@RequestMapping(value="/save", method=RequestMethod.POST, params={"save", "!renew"})
@RequestMapping(value="/save", method=RequestMethod.POST, params={"renew", "!save"})

Cela devrait corriger l'erreur Méthodes de gestionnaire ambiguë mappées pour le chemin HTTP ...

Voir Spring Web API 4.0.x - RequestMapping # params

10
lu_ko

Créez simplement un contrôleur avec une méthode similaire à celle-ci

@RequestMapping(value="/save", method=RequestMethod.POST)
public String handlePost(@RequestParam(required=false , value = "save") String saveFlag , @RequestParam(required=false , value = "renew") String renewFlag){

if(saveFlag != null{
   //handle save
}
else if(renewFlag !=null{
   //handle renew
}

} 
7
J. Moreno

Encore une solution:

@RequestMapping(value="/save", method={RequestMethod.POST}, params={"save=Save"})
@RequestMapping(value="/save", method={RequestMethod.POST}, params={"renew=Renew"})
3
Premraj