2012-03-07 4 views
5

J'ai une application qui se compose de services Web SOAP et REST et d'un accès HTTP simple. Tous convertissent les demandes entrantes et les envoient à un gestionnaire. La chose la plus douloureuse est la gestion des exceptions. Afin de retourner la bonne réponse, je dois emballer chaque méthode avec un bloc try-catch et créer une réponse là-bas. J'ai pensé que je pourrais créer un filtre qui pourrait le faire. Mais comment le filtre peut-il reconnaître la source de celui-ci (savon, reste de repos) alors je savais que je devais retourner une réponse SOAP ou autre?La meilleure façon de gérer les exceptions dans une application avec services Web

Répondre

5

Cela dépend du framework WS que vous utilisez. Tout ce que je sais a une sorte d'intercepteurs/aspects que vous pouvez injecter et gérer des exceptions en un seul endroit. Par exemple dans il y a même un error chain sortant spécial où vous pouvez brancher vos propres intercepteurs.

Evidemment try-catch dans chaque méthode est une mauvaise idée.

+1

j'oublié de mentionner que - j'utilise Apache CXF. Je vais essayer ces intercepteurs, merci. – user219882

1

Il semble que vous n'utilisiez pas de framework parce que c'était typique des frameworks. Par exemple, Spring vous permet de découpler le code de la gestion des exceptions et de définir vos gestionnaires d'exceptions personnalisés.

Dans votre cas, vous avez généralement 2 solutions.

(1) Vous pouvez utiliser pattern Décorateur: envelopper chaque service avec décorateur où chaque méthode est mise en œuvre comme

try { 
    call real method 
} catch() { 
    send error to client 
} 

Comme il est très bavard, vous pouvez gagner du temps en utilisant proxy (Dynamic fonctionnalité qui a été introduit en java 5). Ainsi, vous pouvez envelopper de manière dynamique chaque service (si vos services ont une interface définie).

(2) Vous pouvez le résoudre en utilisant la page d'erreur de l'API servlet:

javax.servlet.ServletException /servlet/ErrorDisplay

pour plus de détails voir http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/

3

En couche inférieure à Web-Service Layer, vous devez créer votre Exception personnalisé et dans Web-Service layer vous devez utiliser try-catch approche pour atteindre occurred exception et catch bloquer log et le convertir en votre exception de couche de service Web personnalisé. Je montre cette approche suivante:

@WebService 
public class EmployeeWS 
{ 
    @WebMethod 
    public void add(Employee em) throws CustomWebServiceException 
    { 
     try 
     { 
     // call facade layer method 
     } 
     catch(Exception e) 
     { 
      logger.error(e.getMessage()); 
      throw new CustomWebServiceException(e); 
     }   
    } 
} 

alternative avec prise d'essai dans une Web-Method, vous pouvez utiliser AOP approch (pour l'échantillon Spring AOP) ou interceptor approche Web-Service frameworks (pour l'échantillon SOAPHandler<T> dans JAX-WS).

Remarque: En JAX-WS standard, vous ne pouvez pas throw un RuntimeException parce Exception doit préciser dans la finale WSDL et si vous throw un RuntimeException votre client de service Web ne réalisent pas votre CustomException, dans une autre votre Web-Method besoin de lancers francs en soi signature.

Vous pouvez voir les documents de faramework Web-Service sélectionnés pour plus d'informations.

Questions connexes