在默认情况下,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