🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# RESTEasy `ExceptionMapper` – 异常处理示例 > 原文: [https://howtodoinjava.com/resteasy/exception-handling-in-jax-rs-resteasy-with-exceptionmapper/](https://howtodoinjava.com/resteasy/exception-handling-in-jax-rs-resteasy-with-exceptionmapper/) 学习使用 resteasy `ExceptionMapper`接口实现创建和处理[自定义异常](https://howtodoinjava.com/java/exception-handling/best-practices-for-for-exception-handling/)。 `ExceptionMapper`是供应器的契约,该供应器将 [Java 异常](https://howtodoinjava.com/java/exception-handling/checked-vs-unchecked-exceptions-in-java/)映射到`Response`对象。 > 必须使用`@Provider`注解`ExceptionMapper`接口的实现才能正常工作。 ## 1\. Resteasy `ExceptionMapper` - 自定义异常处理器 `ExceptionMapper`的示例实现供应器类如下所示: ```java package com.howtodoinjava.exception; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException> { @Override public Response toResponse(MyApplicationException exception) { return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); } } ``` 自定义异常类`MyApplicationException.java`的编写方式为: ```java package com.howtodoinjava.exception; import java.io.Serializable; public class MyApplicationException extends Exception implements Serializable { private static final long serialVersionUID = 1L; public MyApplicationException() { super(); } public MyApplicationException(String msg) { super(msg); } public MyApplicationException(String msg, Exception e) { super(msg, e); } } ``` ## 2\. Resteasy REST API 为了测试`ExceptionMapper`实现,我编写了以下 resteasy REST API。 ```java package com.howtodoinjava.rest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; import org.jboss.resteasy.spi.validation.ValidateRequest; import com.howtodoinjava.exception.MyApplicationException; @Path("/rest") public class UserService { @Path("/users/{id}") @GET @ValidateRequest public Response getUserBId ( @PathParam("id") String id ) throws MyApplicationException { //validate mandatory field if(id == null) { throw new MyApplicationException("id is not present in request !!"); } //Validate proper format try { Integer.parseInt(id); } catch(NumberFormatException e) { throw new MyApplicationException("id is not a number !!"); } //Process the request return Response.ok().entity("User with ID " + id + " found !!").build(); } } ``` ## 3\. RESTEasy `ExceptionMapper`演示 上面的 API 接受`Integer`格式的用户`'id'`参数。 如果我们以无法解析为`Integer`的其他格式传递 id,则会抛出`MyApplicationException`。 我们的异常映射器应该能够处理这个问题。 #### 3.1 有效请求 在浏览器中访问`http://localhost:8080/RESTEasyExceptionMapperDemo/rest/users/1`。 ![Valid request to REST API](https://img.kancloud.cn/fd/2b/fd2b19d17a55df3f511b22c43b169bb7_632x401.png) REST API 的有效请求 #### 3.2 无效请求 - 引发异常 在浏览器中访问`http://localhost:8080/RESTEasyExceptionMapperDemo/rest/users/abc`。 ![Invalid request to REST API](https://img.kancloud.cn/f5/59/f5591b2d56dcf122b79a96b93437f5c0_614x423.png) REST API 的无效请求 要使用`ExceptionMapper`接口下载此 **Resteasy 客户端异常处理示例的源代码**,请遵循以下给定的链接。 [源码下载](https://docs.google.com/file/d/0B7yo2HclmjI4V0ZBZ2xqWllHMnc/edit?usp=sharing "jax-rs exception handling demo source code") 学习愉快!