2013-07-11 1 views
2

J'ai une application Grails, et je veux savoir la meilleure façon de transmettre les erreurs et les messages de ma couche de service à mon contrôleur. Par exemple, disons que je clique sur un lien dans mon application qui appelle un service et qui m'amène à une nouvelle page. Sur cette nouvelle page dans ma demande, je veux voir une liste des messages comme ceci:Meilleure façon de gérer les erreurs et les messages dans le service Grails

Information: 10 files processed successfully. 

Warning: FileA is missing CreationDate 

Error: FileB failed processing 
Error: FileC failed processing 
Error: FileD failed processing 

Je sais que je peux créer un objet personnalisé comme « ServiceReturnObject » avec des propriétés telles que:

def data 
def errors 
def warnings 
def information 

Et tous mes services retournent cet objet. Je sais aussi que je peux utiliser des exceptions, mais je ne suis pas sûr que ce soit la bonne solution avec plusieurs exceptions et plusieurs types d'exceptions.

Quelle est la meilleure pratique ici? Des exemples seraient utiles, merci.

Répondre

1

Pour renvoyer des erreurs, je créer une classe d'exception personnalisée et l'utiliser pour envelopper toutes les autres erreurs qu'un service peut générer. De cette façon, vous avez seulement besoin d'attraper un nombre limité d'exceptions. Si vous avez plus d'une méthode de commande/fermeture qui doit renvoyer des erreurs, je factoriser le code comme ceci:

d'abord, créez votre classe d'exception et le mettre dans src/java dans l'espace de noms droite:

class MyException extends Exception { 
    protected String code; // you could make this an int if you want 
    public String getCode() { return code; } 

    public MyException(String code, String message) { 
     super(message); 
     this.code = code; 
    } 
} 

maintenant, dans votre contrôleur, créez une méthode de gestion des erreurs et envelopper tous les appels dans ce

class MyController { 
    def myService; 

    def executeSafely(Closure c) { 
     Map resp = [:] 
     try { 
      resp.data = c(); 
     } 
     catch(MyException myEx) { 
      resp.error = myEx.getMessage(); 
      resp.code = myEx.getCode(); 
     } 
     catch(Exception ex) { 
      resp.error = 'Unexpected error: ' + ex.getMessage(); 
      resp.code = 'foo'; 
     } 

     return resp; 
    } 


    def action1 = { 
     def resp = executeSafely { 
      myService.doSomething(params); 
     } 

     render resp as JSON; 
    } 

    def action2 = { 
     def resp = executeSafely { 
      myService.doSomethingElse(params); 
     } 

     render resp as JSON; 
    } 
} 

vous pouvez avoir executeSafely convertir la réponse à JSON et juste render directement.

+0

Ne lancez-vous donc que des MyException du service? –

Questions connexes