2009-10-29 5 views
0

J'appelle un service qui crée un enregistrement parent et un enregistrement enfant. Si une erreur survient, le service lance une exception RuntimeException. Le RuntimeExceptionis est intercepté par le contrôleur, puis il y a une redirection vers le gsp. Mais l'erreur n'est pas rendue.Erreurs de rendu à partir d'un service

Dans ce cas, je suppose que le contrôleur et donc le gsp ne fait vraiment rien sur les objets, puisque tout est fait dans le service. Alors, comment puis-je rendre les erreurs?

GSP Entrée simple données

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Sample title</title> 
    </head> 
    <body> 
    <h1>Add A Record</h1> 

<g:hasErrors bean="${parent}"> 
    <div class="errors"> 
     <g:renderErrors bean="${parent}" as="list" /> 
    </div> 
</g:hasErrors> 
<g:hasErrors bean="${child}"> 
    <div class="errors"> 
     <g:renderErrors bean="${child}" as="list" /> 
    </div> 
</g:hasErrors> 
    <g:form action="add" name="doAdd"> 
    <table> 
     <tr> 
     <td> 
      Parent Name 
     </td> 
     <td> 
      Child Name 
     </td> 
     </tr> 
     <tr> 
     <td> 
     <g:textField name="parentName" /> 
     </td> 
     <td> 
     <g:textField name="childName" /> 
     </td> 
     </tr> 
     <tr><td><g:submitButton name="update" value="Update" /></td></tr> 
    </table> 
    </g:form> 
</body> 
</html> 

Contrôleur

class AddrecordController { 

    def addRecordsService 

    def index = { 
     redirect action:"show", params:params 
    } 

    def add = { 
     println "do add" 


     try { 
      addRecordsService.addAll(params) 
     } catch (java.lang.RuntimeException re){ 
      println re.message 
      flash.message = re.message 
     } 
     redirect action:"show", params:params 

    } 

    def show = {} 

} 

service

class AddRecordsService { 

    static transactional = true 



    def addAll(params) { 
     def Parent theParent = addParent(params.parentName) 
     def Child theChild = addChild(params.childName,theParent) 
    } 

    def addParent(pName) { 
     def theParent = new Parent(name:pName) 
     if(!theParent.save()){ 
      throw new RuntimeException('unable to save parent') 
     } 

     return theParent 
    } 

    def addChild(cName,Parent theParent) { 
     def theChild = new Child(name:cName,parent:theParent) 

     if(!theChild.save()){ 
      throw new RuntimeException('unable to save child') 
     } 
     return theChild 
    } 

} 

Répondre

0

Vous NE ed pour obtenir une référence à l'objet invalide d'une manière ou d'une autre et le passer à la vue via le modèle, donc je voudrais étendre RuntimeException et ajouter des champs pour contenir les objets avec des erreurs de validation, par exemple.

}catch(MyCustomException m){ 
render view:'show', model:[parent:m.getParent(), child:m.getChild()] 
} 

Tout cet exercice pourrait être plus facile à l'aide Parent.withTransaction au lieu de la restauration automatique via RuntimeExceptions. Vous pouvez ensuite annuler manuellement la transaction en cas d'erreurs de validation et renvoyer simplement les objets au lieu de les contenir dans l'exception.

Questions connexes