定义用于资源异常和错误的异常映射器

Java™ API for RESTful Web Services (JAX-RS) 应用程序可以产生异常和错误。 缺省行为是使用应用程序容器的异常处理功能,例如 JavaServer Pages (JSP) 错误页。 但是,您可以定制错误处理并在发生异常或错误时发送回特定的响应。

关于此任务

JAX-RS 资源方法与任何 Java 方法相似,可以抛出经过校验的异常和未经校验的异常。缺省情况下,未校验的运行时异常或错误会在容器中再次发生。对于运行在 Web 容器中的资源,已校验的异常包装在 ServletException 中。因此,开发人员可以使用错误处理功能(例如 JSP 错误页)来处理从 JAX-RS 应用程序抛出的异常。

JAX-RS 引入了异常 javax.ws.rs.WebApplicationException。 开发人员可以在创建 WebApplicationException 时指定特定的错误类名称或 javax.ws.rs.core.Response 对象。当抛出 WebApplicationException 时,包括在异常中的信息(采用状态类名或响应对象形式)用于将响应序列化。

如果在代码中不能抛出异常 WebApplicationException 并且不能使用 Web 容器中错误处理功能,但您要使用定制错误响应,那么您可以创建定制的 JAX-RS javax.ws.rs.ext.ExceptionMapper 类以将异常映射至 HTTP 错误响应。

以下过程说明了如何编写定制 ExceptionMapper 类。

过程

  1. 创建用于实现 javax.ws.rs.ext.ExceptionMapper 类的类,并使用 javax.ws.rs.ext.Provider 注释来注释该类。 此步骤假设 JAX-RS 资源可以在其方法中抛出异常 MyCustomException。以下示例说明了简单的 ExceptionMapper 类:
    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. toResponse(MyCustomException) 方法中,返回包含定制错误响应的 Response 对象。 以下示例说明了定制的 ExceptionMapper.toResponse(MyCustomException) 方法:
    @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();
        }
    
    }
    可以在记录错误的位置具有其他代码,检查抛出的异常或使用更复杂的逻辑。
  3. 将已编译的定制 ExceptionMapper 类与 Web 应用程序项目打包在一起。 如果您依靠注释扫描功能来查找 Web 应用程序中的所有 JAX-RS 类,那么不需要任何其他步骤。但是,如果您在 JAX-RS 应用程序子类方法中返回所有相关 JAX-RS 资源类和提供程序,那么还必须将定制 ExceptionMapper 类添加到返回的集中。以下示例说明了已存在的 javax.ws.rs.core.Application 子类:
    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;
        }
    }

    当 JAX-RS 资源方法中发生异常时,您可以定制 HTTP 错误响应,以便用户看不到堆栈跟踪或潜在的保密数据。如果应用程序的行为不正确,请使用 ExceptionMapper 或 Web 容器中的异常处理功能来提供更有帮助的响应。

结果

您已编写了定制的 ExceptionMapper 以处理 JAX-RS Web 应用程序中的异常。


指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_defresource_exception_mapper
文件名:twbs_jaxrs_defresource_exception_mapper.html