2012-03-07 10 views
5

Ho un'applicazione che consiste in servizi Web SOAP e REST e un accesso HTTP semplice. Tutti loro convertono le richieste in arrivo e le inviano a un gestore. La cosa più dolorosa è la gestione delle eccezioni. Per restituire la risposta giusta, devo avvolgere ogni metodo con il blocco try-catch e creare una risposta lì.Il modo migliore di gestire le eccezioni in un'app con servizi Web

Ho pensato che avrei potuto creare un filtro che potesse farlo. Ma come può il filtro riconoscerne la fonte (sapone, frontend di riposo) quindi sapevo che avrei dovuto restituire un SOAP o altra risposta?

risposta

5

Dipende dal framework WS che si utilizza. Tutto quello che so ha una sorta di intercettatori/aspetti che è possibile iniettare e gestire le eccezioni in un unico posto. Ad esempio in c'è anche uno speciale in uscita error chain in cui è possibile collegare i propri intercettori.

Ovviamente try-catch in ogni metodo è una cattiva idea.

+1

Ho dimenticato di dire che - sto usando Apache CXF. Proverò quegli intercettori, grazie. – user219882

1

Sembra che non si stia utilizzando alcun framework perché quello era il tipico framework fornito. Ad esempio, Spring consente di disaccoppiare il codice dalla gestione delle eccezioni e definire i gestori di eccezioni personalizzati.

Nel tuo caso generalmente hai 2 soluzioni.

(1) È possibile utilizzare modello Decorator: avvolgere ogni servizio con decoratore dove ogni metodo è implementato come

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

Dal momento che è molto dettagliato è possibile risparmiare tempo utilizzando il proxy dinamici (caratteristica che è stata introdotta in java 5). Quindi, puoi ricomporre dinamicamente ogni servizio (se i tuoi servizi hanno un'interfaccia definita).

(2) si può risolvere utilizzando pagina di errore servlet API:

javax.servlet.ServletException /servlet/ErrorDisplay

per maggiori dettagli vedi http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/

3

Nello strato di seguito Web-Service Layer, devi creare la tua personalizzata e in Web-Service layer devi utilizzare l'approccio try-catch per ottenere occurred exception e nel blocco catchlog e convertirlo nell'eccezione del livello del servizio Web personalizzato. Mostro questo approccio nella seguente:

@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); 
     }   
    } 
} 

alternativo utilizzando try catturate in Web-Method, è possibile utilizzare AOP approch (per il campione Spring AOP) o interceptor approccio Web-Service frameworks (per il campione in SOAPHandler<T>JAX-WS).

Nota: In JAX-WS di serie, non è possibile throw un RuntimeException perché Exception deve specificare in finale WSDL e se throw un RuntimeException il client di servizio Web non raggiungere il vostro CustomException, in un altro tuo Web-Method necessità di tiri di per sé firma.

È possibile visualizzare i documenti di lavoro diretto selezionati Web-Service per ulteriori informazioni.

Problemi correlati