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



你可能感兴趣的:(Jersey 异常处理)