Jersey 统一异常处理

Jersey 统一异常处理

正如很多成熟的java框架,一定有良好的异常处理机制。对异常的良好处理,也是一个成熟程序的标志。下面关于异常的处理介绍来自REST(Jersey实现)统一异常机制

异常分类

(1)Throwable类是所有异常的始祖,它有两个直接子类Error / Exception:
Error仅在Java虚拟机中发生动态连接失败或其它的定位失败的时候抛出一个Error对象。一般程序不用捕捉或 抛出Error对象。
(2)Unchecked Exception:
a. 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复。
b. 包括Error与RuntimeException及其子类,如:OutOfMemoryError, UndeclaredThrowableException, IllegalArgumentException, IllegalMonitorStateException, NullPointerException, IllegalStateException, IndexOutOfBoundsException等。
c. 语法上不需要声明抛出异常。
(3)Checked Exception:
a. 代表程序不能直接控制的无效外界情况(如用户输入,数据库问题,网络异常,文件丢失等)
b. 除了Error和RuntimeException及其子类之外,如:ClassNotFoundException, NamingException, ServletException, SQLException, IOException等。
c. 需要try catch处理或throws声明抛出异常。

异常处理原则

1、在框架层面封装checked exception,将其转化为unchecked exception,避免开发过程中编写繁冗的try…catch代码。
2、业务层面的开发,根据程序代码职责定义不同的RuntimeException(它就是unchecked exception,一般定义为RuntimeException的子类)
3、通过前两个观点,系统中自定义的异常将只存在unchecked exception,系统只在于客户端交换数据的上层,设置统一异常处理机制,并将一些异常转化为用户所能理解的信息传达给用户。
4、其他如业务层,数据持久层,等底层只负责将异常抛出即可,但要注意不要丢失掉异常堆栈(这一点是初学者容易犯的一个错误)。

异常处理示例

自定义异常

根据上面关于异常的介绍,我们将自定义异常作为运行期异常的子类。同时为了更好的反馈异常,我们重写toString()方法。

public class MyException extends RuntimeException {
    private String code;
    private String description;
    private String message;

    public MyException(String code, String description, String message) {
        this.code = code;
        this.description = description;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 转换为json格式
     * @return
     */
    @Override
    public String toString() {
        JSONObject json = new JSONObject();
        json.put("code",code);
        json.put("description",description);
        json.put("message",message);
        return json.toString();
    }

}

异常处理类

Jersey框架中异常处理类需要实现ExceptionMapper同时可以指定对应的泛型。当一个项目自定义异常有很多时,根据业务需要我们可以采取不同的处理方式。

1、 采用统一的异常处理
就是将所有的的自定义异常都放到一个异常处理类中进行处理。

    @Provider//该注解的作用是用于表明该类是javax.ws.rs的一种组件
    public class MyExceptionMapper implements ExceptionMapper<Exception>{
        public Response toResponse(Exception e) {
            //判断异常的种类
            if(e instanceof MyException){
                e.printStackTrace();
            }
            return Response.status(Response.Status.BAD_REQUEST).entity(e.toString()).build();
        }
    }

2、 有针对性的异常处理
针对不同的异常使用不同的异常处理类。

@Provider
public class MyExceptionHandler  implements ExceptionMapper<MyException>{

    public Response toResponse(MyException e) {
        System.out.println(24);
        return Response.status(Response.Status.BAD_REQUEST).entity(e.toString()).build();
    }
}

异常处理需要满足三个条件

  • 实现ExceptionMapper,重写toResponse方法。
  • 加上@Provider声明该类是Jersey的组件
  • 在Application中注册该异常处理类,或者声明异常处理类所在的包
@ApplicationPath("/")
public class Application extends ResourceConfig{
    public Application() {
        /*声明资源包所在位置
        * */
        packages("cn.lx.resource");
        /*注册异常处理类
        * */
        // 当一个异常有多种处理方式的时候,按照异常处理类的顺序,先注册的捕获处理该异常,
        register(MyExceptionHandler.class);
        register(MyExceptionMapper.class);
        /*声明异常包所在的位置
        * */
        packages("cn.lx.exception");
    }
}

异常处理测试

/**该类用于测试自定义异常处理类的使用
 * Created by lxliuxuan on 2016/11/16.
 */
@Path("/test")
public class TestResource {
    @GET
    @Path("/exce")
    public Response getExce(@QueryParam("userId") String userId){
        System.out.println(1);
        if(userId == null){
            throw new MyException("1001","访问参数不合法","错误请求");
        }
        return null;
       // return Response.ok().entity("success").build();
    }

}

启动程序,访问http://localhost:8080/test/exce 当不传递userId参数时,程序会抛出自定义异常,服务器响应400 {“code”:”1001”,”description”:”访问参数不合法”,”message”:”错误请求”}。
当传递userId参数时,程序不抛出异常,服务器响应200,success 表示自定义异常处理测试成功。

异常处理使用较为灵活,可以根据不同的业务需求采取不同的处理方式,更多的资料请参考官方文档。
Jersey官方手册
JerseyApi

Jersey系列相关源码请访问:Jersey_learing项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值