在默認狀況下,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