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