2009-05-26 7 views
2

J'ai un contrôleur annoté Spring 2.5 dans lequel j'ai une méthode annotée avec @RequestMapping (method = RequestMethod.GET), qui effectue une certaine logique pour remplir le modèle.Liaison de données des paramètres annotés @ModelAttribute

J'ai également une méthode annotée avec @RequestMapping (method = RequestMethod.POST) qui effectue la requête. Cette méthode a un paramètre annoté @ModelAttribute qui contient mon propre formulaire pojo, appelons-le MyForm. J'ai aussi une méthode d'initialisation pour MyForm, également annotée avec @ModelAttrribute. Maintenant, jusqu'à présent tout fonctionne comme prévu: sur une demande POST les données du formulaire se lient à MyForm et je peux le traiter.

Le problème est que je veux être en mesure de pré-remplir le formulaire en transmettant des paramètres de requête (GET). Puisque j'ai la méthode @ModelAttribute pour MyForm, j'obtiens une instance MyForm dans mon modèle, mais elle n'est pas remplie sauf si je l'utilise spécifiquement comme paramètre pour ma méthode GET.

Pourquoi dois-je faire cela, est-il possible de forcer la liaison de données sur mon formulaire pour une demande GET d'une manière différente? Je passe maintenant juste dans le paramètre, mais parce qu'il est déjà dans le modèle, je n'ai rien à faire avec, résultant en un paramètre de méthode inutilement laid.

[Edit: quelques exemples de code pour illustrer]

Le contrôleur qui ne remplit pas le formulaire sur une requête get:

@Controller 
public class MyController { 

    @ModelAttribute("myForm") 
    public MyForm createForm() { 
    return new MyForm(); 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    public void handlePage(Model model) { 
    //Do some stuff to populate the model.... 
    } 

    @RequestMapping(method=RequestMethod.POST) 
    public void processForm(@ModelAttribute("myForm") MyForm myForm) { 
    //Process the form 
    } 
} 

Quand je change la signature de la méthode de la méthode handlePage, il obtient peuplé sur une requête get ...

@RequestMapping(method=RequestMethod.GET) 
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) { 
    //Do some stuff to populate the model.... 
} 
+0

Quand vous dites que vous avez votre propre formulaire, vous voulez dire juste un objet de domaine, n'est-ce pas? (par opposition à une implémentation de forme de ressort personnalisé.) Votre vue est-elle juste une JSP standard? –

+0

Oui, vous avez raison. Juste un objet de domaine. Ma vue n'est pas une JSP, mais je vais vous épargner les détails de l'implémentation de la vue (pas la mienne), car je peux écrire un livre à ce sujet ... –

Répondre

2

la méthode avec le @ModelAttribute est autorisé à avoir des arguments que @RequestMapping supports Par exemple, vous pouvez ajouter combien d'arguments @RequestParam sont nécessaires pour remplir votre objet de commande, ou même la requête http elle-même. Je ne suis pas sûr si vous pouvez obtenir une instance du classeur de données de la même manière ou non.

lecture de la documentation à nouveau, je pense que l'idée est que la pré-population dans la méthode @ModelAttribute serait par base de données, ce qui est probablement la raison pour laquelle il n'y a pas de liaison de données passe sans ajouter l'@ModelAttribute comme argument à la méthode @RequestMapping .

+1

Non, le classeur de données n'est disponible que dans un @InitBinder méthode annotée. J'ai pensé à ça aussi ... à mauvais ça ne marche pas :( Maintenant, je viens de le "réparer" en passant dans l'attribut model et en l'annotant avec @SuppressWarnings ("unused"). –

Questions connexes