博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RESTEasy中的通用异常处理ExceptionMapper
阅读量:5835 次
发布时间:2019-06-18

本文共 2828 字,大约阅读时间需要 9 分钟。

RESTEasy是JBoss提供的一个Restful基础框架,使用它我们可以很方便的构建我们的Restful服务,而且它也完全符合Java的JAX-RS2.0标准,很多第三方Restful框架也都是基于RESTEasy开发的。

在任何框架中都不可避免的涉及到异常处理,Restful框架也是如此。按照我们一般传统异常处理方式,在Restful的最外层,我们一般会对所有的业务调用都加上try catch,以免异常被用户接收到,比如我们有这么一个Restful服务:

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;@Path("/rest")public class UserApi{    @Autowire    UserService userService;    @Path("/users/{id}")    @GET    @ValidateRequest    public Response getUserBId  ( @PathParam("id") String id ) throws RuntimeException    {        try{            User user=userService.getUser(id);        } catch(IllegalArgumentException e) {            //if exception occured            return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();         } catch(Exception e) {            //if exception occured            return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();         }        //if success        return Response.ok().entity("User with ID " + id + " found !!").build();    }}

上面UserApi接口中的getUserBId()方法调用了userService.getUser()服务,这个服务会抛出一些异常,UserApi需要捕获异常并返回客户的一个错误的响应。还有一点我们一般会在API层catch一个Exception异常,也就是捕获所有可能发生的异常情况,以免前端出现不友好的错误提示。

这么做也没什么问题,但是我们的接口不只是一个,每个接口需要进行try catch来处理异常,这么做显然不符合我们的编程思想,我们希望把所有异常集中到一个地方处理。

如果我们的Restful框架是基于RESTEasy的,那么我们就可以使用ExceptionMapper来实现一个通用异常处理类。

使用ExceptionMapper进行通用异常处理

ExceptionMapper是provider的一个协议,它会将Java的异常映射到Response对象。所以要进行通用异常处理,我们只需要写一个类来实现ExceptionMapper接口,并把它声明为一个provider即可:

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;@Providerpublic class MyApplicationExceptionHandler implements ExceptionMapper
{ @Override public Response toResponse(Exception exception) { return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); }}

上面的ExceptionMapper的实现已经写好了,下面我们写个Restful API来测试下:

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;@Path("/rest")public class UserApi{    @Autowire    UserService userService;    @Path("/users/{id}")    @GET    @ValidateRequest    public Response getUserBId  ( @PathParam("id") String id ) throws RuntimeException    {        try{            User user=userService.getUser(id);        } catch(IllegalArgumentException e) {           throw new RuntimeException("id is not a number !!");        }         return Response.ok().entity("User with ID " + id + " found !!").build();    }}

在这个接口中,我们并没有对异常做特殊处理,也没有catch一个Exception异常,仅仅是把异常抛出,而所有的异常处理都集中在了MyApplicationExceptionHandler中。

我们测一下这个接口,首先我们写一个合法的请求:

这里写图片描述

我们再写一个不合法的请求,请求的参数是个字符串而不是数值:

这里写图片描述

你可能感兴趣的文章
抓住云机遇编排工作 搞定复杂IT工作流
查看>>
MYSQL的longtext字段能放多少数据?
查看>>
MTK 平台上如何给 camera 添加一种 preview size
查看>>
云计算最大难处
查看>>
关于数据分析思路的4点心得
查看>>
Memcached安装与配置
查看>>
美团数据仓库的演进
查看>>
SAP被评为“大数据”预测分析领军企业
查看>>
联想企业网盘张跃华:让文件创造业务价值
查看>>
记录一次蚂蚁金服前端电话面试
查看>>
直播源码开发视频直播平台,不得不了解的流程
查看>>
Ubuntu上的pycrypto给出了编译器错误
查看>>
聊聊flink的RestClientConfiguration
查看>>
在CentOS上搭建git仓库服务器以及mac端进行克隆和提交到远程git仓库
查看>>
測試文章
查看>>
Flex很难?一文就足够了
查看>>
【BATJ面试必会】JAVA面试到底需要掌握什么?【上】
查看>>
CollabNet_Subversion小结
查看>>
mysql定时备份自动上传
查看>>
17岁时少年决定把海洋洗干净,现在21岁的他做到了
查看>>