2012-03-07 15 views
5

Tengo una aplicación que consiste en servicios web SOAP y REST y un acceso HTTP simple. Todos ellos convierten las solicitudes entrantes y las envían a un controlador. Lo más doloroso es el manejo de excepciones. Para devolver la respuesta correcta, tengo que ajustar cada método con el bloque try-catch y crear una respuesta allí.La mejor forma de manejar excepciones en una aplicación con servicios web

Pensé que podría crear un filtro que podría hacerlo. Pero, ¿cómo puede el filtro reconocer su origen (soap, rest frontend), así que sabía que debería devolver un SOAP u otra respuesta?

Respuesta

5

Depende del marco de WS que utilice. Todo lo que sé tiene algún tipo de interceptores/aspectos que puedes inyectar y manejar excepciones en un solo lugar. Por ejemplo, en , hay incluso una salida especial error chain donde puede conectar sus propios interceptores.

Obviamente try-catch en todos los métodos es una mala idea.

+1

me olvidó mencionar que - estoy usando Apache CXF. Probaré esos interceptores, gracias. – user219882

1

Parece que no está utilizando ningún marco de trabajo porque eso era típico. Por ejemplo, Spring le permite desacoplar el código del manejo de excepciones y definir sus manejadores de excepciones personalizados.

En su caso, generalmente tiene 2 soluciones.

(1) Se puede utilizar Decorator: envolver cada servicio con decorador, donde se lleva a cabo cada método como

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

Puesto que es muy prolijo que puede ahorrar tiempo mediante Dynamic proxy (característica que se introdujo en Java 5). Por lo tanto, puede envolver dinámicamente cada servicio (si sus servicios tienen una interfaz definida).

(2) se puede resolver utilizando la página de error servlet del API:

javax.servlet.ServletException /servlet/ErrorDisplay

para más detalles ver http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/

3

En la capa de abajo Web-Service Layer, debe crear su Exception personalizado y en Web-Service layer tiene que utilizar el enfoque try-catch para lograr occurred exception y en catch bloquear log y convertirlo a su excepción personalizada de capa de servicio web. Muestro este enfoque en lo siguiente:

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

Alternativa utilizando cualquier intento de captura en Web-Method, puede utilizar AOP approch (por ejemplo Spring AOP) o interceptor enfoque en Web-Service frameworks (por ejemplo SOAPHandler<T> en JAX-WS).

Nota: En JAX-WS norma, no se puede throw un RuntimeException porque Exception debe especificar en la final WSDL y si throw un RuntimeException su cliente de servicios web no lograr su CustomException, en otro Web-Method su necesidad a los tiros en sí mismo firma.

Puede ver los documentos de faramework seleccionados Web-Service para obtener más información.

Cuestiones relacionadas