Definición de los correlacionadores de excepción de errores y excepciones de recursos

Las aplicaciones JAX-RS (API de Java™ para servicios web RESTful) pueden producir excepciones y errores. El comportamiento predeterminado es utilizar la funcionalidad de manejo de excepciones de un contenedor de aplicaciones como las páginas de error JSP (JavaServer Pages). Sin embargo, puede personalizar el manejo de errores y devolver respuestas específicas de seguridad cuando se produce una excepción o un error.

Acerca de esta tarea

Los métodos de recursos JAX-RS, como cualquier método Java, pueden generar excepciones comprobadas y no comprobadas. De forma predeterminada, una excepción o un error de tiempo de ejecución no comprobado se vuelve a producir en el contenedor. Una excepción comprobada se incluye en una ServletException para los recursos que se ejecutan en el contenedor web. Por lo tanto, un desarrollador puede utilizar los recursos de manejo de errores como páginas de error JSP para manejar las excepciones emitidas desde una aplicación JAX-RS.

JAX-RS presentó la excepción, javax.ws.rs.WebApplicationException. Un desarrollador puede especificar un nombre de clase de error o un objeto javax.ws.rs.core.Response específico al crear una WebApplicationException. Cuando se genera la WebApplicationException, la información incluida en la excepción mediante un nombre de clase de estado o el objeto Response se utiliza para serializar una respuesta.

Si no puede emitir la excepción, WebApplicationException, en el código y no puede utilizar el recurso de manejo de errores en el contenedor web, pero desea utilizar una respuesta de error personalizada, puede crear una clase JAX-RS javax.ws.rs.ext.ExceptionMapper personalizada para correlacionar excepciones con respuestas de error HTTP.

El procedimiento siguiente muestra cómo escribir una clase ExceptionMapper personalizada.

Procedimiento

  1. Cree una clase que implemente la clase javax.ws.rs.ext.ExceptionMapper y anote la clase con la anotación javax.ws.rs.ext.Provider .
    En este paso se presupone que el recurso JAX-RS puede generar la excepción, MyCustomException, en sus métodos. En el ejemplosiguiente se muestra una clase ExceptionMappersencilla:
    import javax.ws.rs.core.Response;
    import javax.ws.rs.ext.ExceptionMapper;
    import javax.ws.rs.ext.Provider;
    
    @Provider
    public class CustomExceptionMapper implements ExceptionMapper<MyCustomException> {
    
        public Response toResponse(MyCustomException exception) {
            return null;
        }
    
    }
  2. En el método toResponse(MyCustomException) , devuelve un objeto Response que contiene la respuesta de error personalizada.
    En el ejemplo siguiente se muestra un métodoExceptionMapper.toResponse(MyCustomException)personalizado:
    @Provider
    public class CustomExceptionMapper implements ExceptionMapper<MyCustomException> {
    
        public Response toResponse(MyCustomException exception) {
            return Response.status(500).entity("Unfortunately, the application cannot
                process your request at this time.").type("text/plain").build();
        }
    
    }
    Puede tener un código adicional donde se puede registrar un error, inspeccionar la excepción generada, o utilizar lógica más compleja.
  3. Empaquete la clase ExceptionMapper personalizada compilada con el proyecto de aplicación web.
    Si confía en las prestaciones de exploración de anotaciones para encontrar todas las clases JAX-RS en la aplicación web, no se necesitan pasos adicionales. Sin embargo, si devuelve todos los proveedores y todas las clases de recursos JAX-RS relevantes en un método de subclase de la aplicación JAX-RS, también debe añadir la clase ExceptionMapper personalizada al conjunto devuelto. Enel ejemplo siguiente se muestra una subclasejavax.ws.rs.core.Application ya existente:
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.ws.rs.core.Application;
    
    public class MyApplication extends Application {
    
        @Override
        public Set<Class<?>> getClasses() {
            Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(CustomExceptionMapper.class);
            /* add your additional JAX-RS classes here */
            return classes;
        }
    }

    Cuando se producen excepciones en los métodos de recursos JAX-RS, puede personalizar la respuesta de error HTTP para que un usuario no pueda ver un rastreo de pila o datos potencialmente confidenciales. Utilice un ExceptionMapper o la prestación de manejo de excepciones en el contenedor web para proporcionar respuestas más útiles si el comportamiento de la aplicación no es correcto.

Resultados

Ha escrito un ExceptionMapper personalizado para manejar las excepciones de la aplicación web JAX-RS.