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

相關文章
相關標籤/搜索