Jersey 异常处理

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

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

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

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

@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();
    }
}

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

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
ui

Jersey测试,请看JerseyTest
spa

相关文章
相关标签/搜索