2010-01-20 8 views
2

J'ai un doute de base sur la façon de procéder dans mon application. J'ai un formulaire et j'ai besoin de valider toutes les entrées qui sont des nombres. J'ai un problème en décidant le type des attributs du haricot associé au formulaire. Je ne sais pas si les mettre à cordes ou à doubler et voici les raisons:Valider les numéros au printemps

  • Si je les mets à doubler: Si je rentre dans quelque chose d'entrée qui est pas un nombre lorsque le printemps renseigne les entrées en le bean je reçois une exception dans le JSP qu'il ne pourrait pas le convertir en double.
  • Si je les mets à String: J'ai une bonne validation bien que je doive les changer pour doubler. Mais mon problème ici est que ce bean est stocké dans une base de données avec hibernate et l'annotation @column le stocke comme un texte et je voudrais le stocker comme s'il s'agissait d'un double. Est-il possible de changer le type de colonne en type à double différé?

Est-ce que quelqu'un peut me donner une idée sur la façon de précéder dans ce cas? Merci.

Répondre

3

Je vous suggère de toujours travailler avec vos types de domaine et de ne pas utiliser de chaîne juste parce que c'est ainsi que HTTP envoie les paramètres. Si un champ a le type double, vous l'utiliserez comme tel dans votre code et le stockerez comme tel dans la base de données. Laissez Spring convertir les paramètres de requête à votre type nécessaire. La liaison de données est utile pour permettre à l'entrée de l'utilisateur d'être liée dynamiquement au modèle de domaine d'une application (ou à tout autre objet que vous utilisez pour traiter une entrée utilisateur). Spring fournit la classe DataBinder pour faire exactement cela.

Vous pouvez enregistrer ceux dans la méthode initBinder de vos contrôleurs et vous permettra de transformer les chaînes de votre demande dans le type désiré. Voir par exemple la classe CustomNumberEditor utilisée pour analyser les chaînes de nombres entrées par l'utilisateur dans les propriétés Number des beans. Vous pouvez ensuite combiner cela avec le Validator interface pour des contrôles plus complexes.

EDIT: utilise la liaison Spring typeMismatch codes d'erreur pour les erreurs de liaison lorsqu'une conversion échoue (required code si vous spécifiez un champ obligatoire mais vous ne fournissez pas). Dans votre cas, il affiche par défaut le message d'exception. Pour modifier le message en un message plus convivial, vous devez fournir une clé de regroupement dans votre fichier de propriétés à l'aide du préfixe typeMismatch.

Ceci est spécifié par le DataBinder.setMessageCodesResolver et est par défaut org.springframework.validation.DefaultMessageCodesResolver. Dans le javadoc de DefaultMessageCodesResolver vous pouvez voir des exemples complets, mais fondamentalement, il vous suffit d'ajouter une entrée comme celui-ci dans votre fichier de propriétés:

typeMismatch.yourField=Your user friendly error message goes here 
+0

merci, mais j'ai une question à ce sujet. Je crée un CustomNumberEditor, mais quand j'entre une chaîne qui n'est pas un nombre, je dois lancer une exception (je ne peux pas simplement la mettre à 0). Puis quand j'effectue la validation dans les erreurs il découvre qu'il y a cette exception mais quand j'essaye d'écrire le message d'erreur avec la balise de forme: des erreurs il écrit dans l'écran la cause d'Exception. Puis-je mapper cette exception à un message personnalisé permettant de ne pas afficher le nom de la classe d'exception? Merci. – Javi

+0

@Javi: J'ai édité la réponse pour répondre à votre question. –

+0

Merci beaucoup – Javi

0

Si vous utilisez Spring 3.0

un coup d'oeil à la par défaut prépondérants avec annotations partie de

Spring 3 Type Conversion and Validation

Si vous nous Vous pouvez réaliser cette opération en enregistrant PropertyEditor personnalisé comme indiqué ci-dessus.

1

Vous pouvez mapper l'exception au message personnalisé si vous avez une entrée dans le formulaire suivant dans votre message.propriétés (ou l'ensemble de messages équivalent que vous utilisez).

typeMismatch.fieldName, où fieldName serait le nom du champ que vous validez.