11
votes

Grails, comment puis-je obtenir un objet de ne pas économiser

Je suis nouveau dans Grails et essayez de créer un formulaire qui permet à un utilisateur de modifier l'adresse e-mail associée à son compte pour un site que je crée.

Il demande à l'utilisateur de leur mot de passe actuel et Pour la nouvelle adresse e-mail, ils veulent utiliser. Si l'utilisateur entre dans le mauvais mot de passe ou à une adresse e-mail non valide, il doit les rejeter avec un message d'erreur approprié.

La validation du courrier électronique peut être effectuée par des contraintes dans Grails, mais le changement de mot de passe doit correspondre à leur mot de passe actuel. J'ai mis en place cette vérification comme méthode sur une classe de service.

Voir le code ci-dessous: xxx

maintenant ce que j'ai remarqué c'était impair que si je entré dans un courrier électronique non valide, il ne sauvegarderait pas les modifications (comme prévu), mais si je suis entré dans le mauvais mot de passe et un email valide, il enregistre les modifications et même les écrire dans la base de données même si elle donnerait le bon mot de passe non valide. "Message d'erreur.

J'étais perplexe, alors définissez des points de rupture dans tous les blocs if / else si / else bloque et constaté qu'il frappait la première instruction si prévu et ne frappait pas les autres, donc ce ne serait jamais Venez accrocher un appel à la méthode Save (), mais il a été sauvé de toute façon.

Après un peu de recherche, je suis arrivé à une documentation accrue pour la méthode Jeter () que vous pouvez voir utilisée dans le code ci-dessus. Alors j'ai ajouté cela mais toujours pas en profit. J'ai même essayé d'utiliser le rejetage puis rechargez l'objet client de la DB à nouveau mais toujours pas de dés.

C'est très frustrant et je serais reconnaissant de toute aide, car je pense que cela ne devrait sûrement pas être compliqué exigence!


3 commentaires

Client.Discard () devrait être le moyen de le faire, pouvez-vous reproduire le problème dans un test d'intégration? Quelle version des grails utilisez-vous?


Je viens d'essayer un test d'intégration sur le code, il semblait curieusement cela semblait se comporter comme je le voulais mais quand je l'ai fait normalement à travers le Web, j'ai eu le même problème. Je posterais mon code de test mais je ne peux pas comprendre comment faire cela ici, ça me dit que c'est trop de caractères


Vous devriez accepter la réponse ci-dessous!


5 Réponses :


10
votes

GRAILS ferme votre session hibernate à la fin de la demande Web, qui éliminera l'objet modifié. L'objet est connecté à votre session hibernate, car vous en avez la saisie via Hibernate ( get () ). Si vous souhaitez éviter d'avoir le changement rincé, vous devez utiliser Jeter () .

Ceci est effectué automatiquement par un validateur défaillant, c'est pourquoi vous ne devez pas le faire pour une validation échouer.

Vous simplifieriez le code, cependant, en déplaçant cette logique à un validateur personnalisé sur l'un de vos champs ClientUtiliser , ce qui éliminerait automatiquement l'objet sur une défaillance ou à l'aide d'une commande GRAVES. objet, qui pourrait également encapsuler la logique de vérification. Ensuite, vous venez de vérifier les erreurs sur l'objet de commande.


2 commentaires

Oui, mais c'est ce qui me puzzeling, j'utilise Jeter et cela fonctionne sur le test d'intégration mais pas sur le Web


N'oubliez pas que les tests d'intégration réduisent votre transaction à la fin. Sur le Web, votre transaction finira par commettre.



0
votes

Vous ne faites que faire Flash qui n'a rien à voir avec la transaction du roulement. En cas d'erreur, lancez RunTimeException et que vous réduirez vos modifications à la base de données.


0 commentaires

2
votes

Utiliser Lire méthode qui récupère une instance de la classe de domaine pour l'ID spécifié dans un état en lecture seule.

Voir le Documentation GRAVES sur Lire .


0 commentaires

6
votes

Utilisation de la méthode get () récupérer des données en mode lecture-écriture, donc si vous changez tout ce qu'il sera persister. Utilisez la méthode de lecture () qui peut récupérer des données en lecture seule, donc si vous modifiez que quelque chose doit alors utiliser. () Méthode.That va résoudre votre problème.

Jetez un coup d'œil à cette http://grails.org/doc/laest /Guide/gorm.html#basicCrud


1 commentaires

Cela fonctionne pour moi bien que je ne comprenne pas pourquoi jeter ne fonctionne pas si vous utilisez get, merci quand même



0
votes

Après une R & D, je précise que nous devons effacer toute une session comme: xxx

selon le Documentation :

Effacer complètement la session. Evléchir toutes les instances chargées et annuler Tous les sauvegardes en attente, les mises à jour et les suppressions. Ne fermez pas les itérateurs ouverts ou des instances de scrollablesults.

Nous devons bien nettoyer la session hibernate. En conséquence, la session est de retour à l'état utilisable et pour une utilisation future, elle n'aura aucune incidence sur l'erreur précédente.


0 commentaires