2009-04-01 7 views
6

J'essaie de créer un formulaire pour éditer une ligne de base de données existante. J'utilise la balise de formulaire Spring MVC pour lier automatiquement le html à un objet de support de formulaire. La ligne a une relation plusieurs à plusieurs avec une autre table, que j'essaie de représenter avec une boîte de sélection multiple en utilisant le formulaire: select tag; J'utilise Hibernate pour la persistance afin que la relation soit représentée comme un HashSet dans le pojo Bundle.Spring MVC form: select Tag, plusieurs sélections ne sont pas correctes?

private Set<Rule> rules = new HashSet<Rule>(0); 

Sans la boîte de sélection sur la page, l'objet mettra à jour la base de données correctement, mais avec la boîte de sélection de l'objet ne sera pas mise à jour de la base de données et je reçois cette erreur dans mon journal log4j, notez que cette erreur ne provoque pas d'exception, elle n'est visible que dans les journaux; Cela se produit même si je désélectionne des éléments dans la zone de sélection, l'ensemble du formulaire refuse de soumettre correctement. Quelqu'un peut-il m'aider?

Je suis au courant de How do I bind collection attributes to a form in Spring MVC, ce qui est similaire à cette question, malheureusement, aucune des suggestions n'a semblé utile à mon problème.

+0

On dirait que certains de vos messages d'erreur ont été coupés - avez-vous plus de l'erreur? Une trace de pile? –

+0

Eh bien, pour une raison quelconque, le message est au niveau de débogage. Ce n'est pas vraiment une exception. J'ai mal écrit quand j'ai mentionné une trace de pile, je vais corriger cela maintenant. –

Répondre

8

Le problème est avec la soumission de votre formulaire. Spring n'est pas capable de lier un objet de la commande, donc il ne soumet pas le formulaire, mais vous redirige vers le formView à la place.

Lorsque la liaison est effectuée avec succès, vous verrez ce message à la place:

No errors -> processing submit 

Pour résoudre votre problème, vous devez enregistrer un CustomCollectionEditor avec votre contrôleur. (Voir ceci link). Ce serait quelque chose comme ceci:

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception 
{ 
    binder.registerCustomEditor(Set.class, "rules", new CustomCollectionEditor(Set.class) 
    { 
    protected Object convertElement(Object element) 
    { 
     String name = ""; 

     if (element instanceof String) 
      name = (String) element; 

     return name != null ? new Rule(name) : null; 
    } 
    }); 
} 
+0

Merci, malheureusement, je ne peux pas arriver à wordpress du travail. Si vous pouvez poster plus de détails, je l'apprécierais. –

+0

C'est ce que j'avais besoin de faire. Une fois que j'ai implémenté votre extrait de code, tout a fonctionné. Pouvez-vous recommander une bonne source d'apprentissage pour Spring MVC? J'ai lu la documentation/didacticiels sur SpringSource.org et j'ai acheté le livre Spring In Action, mais ni l'un ni l'autre n'a la profondeur dont j'ai besoin. –