Jersey 异常处理

在默认情况下,jersey处理业务层抛出的异常,生成http的500状态码,不会针对不同的异常生成不同的状态码。

jersey处理异常,主要有两种方式。

1、实现javax.ws.rs.ext.ExceptionMapper<T>,T为所要抛出的异常类型。当jersey捕获到T异常,就返回实现类的响应。

当抛出RuntimeException异常,就会返回404异常。需要注意的是:实现类要加@Provider注解,而且要放在jersey资源所在的包路径,以便jersey扫描到。

@Provider
public class Exception404Mapper implements ExceptionMapper<RuntimeException> {
    @Override
    public Response toResponse(RuntimeException e) {
        return Response.status(404).entity(e.getMessage())
                .type(MediaType.TEXT_PLAIN).build();
    }
}

2、继承javax.ws.rs.WebApplicationException,当然也可以直接抛出WebApplicationException,不过得到的是默认的500错误状态码。这里定义了401异常状态码。这样jersey捕获到ParameterException异常,将会返回http 401错误状态码。

public class ParameterException extends WebApplicationException {
    private static final long serialVersionUID = 1L;

    public ParameterException() {
        super(Response.status(401).entity("参数异常").type(MediaType.TEXT_PLAIN)
                .build());
    }

    public ParameterException(String msg) {
        super(Response.status(401).entity(msg).type(MediaType.TEXT_PLAIN)
                .build());
    }
}

测试如下:wr是com.sun.jersey.api.client.WebResource。使用junit的fail(),我们就可以确定代码的执行流程。

    /**
     * 测试404错误状态码
     */
    @Test
    public void test404Exception() {
        try {
            wr.path("exception").get(Response.class);
            fail();
        } catch (UniformInterfaceException e) {
            ClientResponse response = e.getResponse();
            response.getStatus();
            assertEquals(404, response.getStatus());
        } catch (ClientHandlerException e) {
            fail();
        }
    }

    /**
     * 测试401错误状态码
     */
    @Test
    public void testWebApplicationException() {
        try {
            wr.path("exception/webApplicationException").get(Response.class);
            fail();
        } catch (UniformInterfaceException e) {
            ClientResponse response = e.getResponse();
            response.getStatus();
            assertEquals(401, response.getStatus());
        } catch (ClientHandlerException e) {
            fail();
        }
    }

Jersey的使用,请看Jersey

Jersey测试,请看JerseyTest

时间: 2024-11-10 10:37:26

Jersey 异常处理的相关文章

REST(Jersey实现)统一异常机制

一:异常分类  (1)Throwable类是所有异常的始祖,它有两个直接子类Error / Exception: Error仅在Java虚拟机中发生动态连接失败或其它的定位失败的时候抛出一个Error对象.一般程序不用捕捉或  抛出Error对象. (2)Unchecked Exception: a. 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复. b. 包括Error与RuntimeException及其子类,如:OutOfMemoryError, UndeclaredThrowableE

Jersey Rest 异常统一处理机制

前言: 异常分为运行时异常和非运行时异常,所谓的运行时异常是指那些不需要异常捕获的异常,总是交由虚拟机接管,如:ArrayIndexOutOfBoundsException,我们在写程序时,并没有使用try..catch来捕获它. 以前,我们进行项目开发时,习惯性的喜欢使用大量的try...catch...finally方法来进行异常处理,并且,只是将异常信息保存到log日志中即可,并没有将一些异常信息以可读性的方式返回给前端用户.而在一些比较大的项目中,进行异常统一处理是架构师或项目经理必须考

Jersey统一异常处理

众所周知,java服务提供者提供给服务请求者应该是特定格式的数据,而不能出现异常栈类似信息,那么jersey中,如何添加统一的异常处理呢? 针对jersey启动如果是实现了ResourceConfig接口的实现类,可以注册自定义的异常处理类. /** * 功能说明:统一异常处理过滤器 * @return <br/> * 修改历史:<br/> * 1.[2016年09月09日上午11:11] 创建方法 by hw */ @Provider public class Exception

Jersey的异常处理

Jersey框架为我们提供了更为通用异常处理方式.通过实现ExceptionMapper接口并使用@Provider注解将其定义为一个Provider,可以实现通用的异常的面向切面处理,而非针对某一个资源方法的异常处理. 示例: @Provider public class EntityNoFoundMapper implements ExceptionMapper<Jaxrs2GuideNotFoundException>{ @Override public Response toRespo

jersey在 spring boot 添加 packages 扫描路径支持

最近公司内部系统要做数据对接,故使用 jersey 来做 restful webservice 接口设计.由于 spring boot 已经集成 jersey,估计直接导入 spring-boot-starter-jersey 就好了. 在测试时候除了遇到中文乱码之外花费了比较长的时间,其余暂时没遇到大的问题.然而发布的时候发现了一个坑. public class JerseyConfig extends ResourceConfig { public JerseyConfig(){ //reg

SpringMVC基础(二)_文件上传、异常处理、拦截器

实现文件上传 实现文件上传,需要借助以下两个第三方 jar 包对上传的二进制文件进行解析: commons-fileupload commons-io form表单的 enctype 取值必须为:multipart/form-data(默认为:application/x-www-form-urlencoded):enctype为表单请求正文的类型:method 属性必须取值为 post 方式:提供一个文件选择域: <input type="file"/> : <for

Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. 百牛信息技术bainiu.ltd整理发布于博客园 Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理.

笔记:Jersey REST 传输格式

通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.short.int.long).2种浮点类型(float.double).Unicode编码的字符(char)和布尔类型(boolean),Jersey 支持全部的基本类型,还支持与之相关的引用类型,示例代码如下: REST 服务代码 @POST @Path("b") public String

笔记:Jersey REST 传输格式-JSON

JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Jackson 基于POJO的JSON绑定 是 否 是 基于JAXB的JSON绑定 是 否 是 低级的(逐字的)JSON解析和处理 否 是 否 使用 MOXy 处理JSON MOXy 是 EclipseLink项目的一个模块,是使用JAXB和SDO作为XML绑定的技术基础,实现了JSR222标准(JAX