眾所周知,java服務提供者提供給服務請求者應該是特定格式的數據,而不能出現異常棧類似信息,那么jersey中,如何添加統一的異常處理呢?
針對jersey啟動如果是實現了ResourceConfig接口的實現類,可以注冊自定義的異常處理類。
/** * 功能說明:統一異常處理過濾器 * @return <br/> * 修改歷史:<br/> * 1.[2016年09月09日上午11:11] 創建方法 by hw */ @Provider public class ExceptionHandler implements ExceptionMapper<Exception> { @Override public Response toResponse(Exception e) { BaseResponse response = new BaseResponse(); if (e instanceof SuperException) { SuperException exp = (SuperException) e; response.setErrCode(exp.getCode()); response.setMsg(exp.getMessage()); } else { response.setErrCode(ErrorsDiscriptor.InvalidAuthCode.code()); response.setMsg(ErrorsDiscriptor.InternalService.message()); } return Response.ok().entity(response).build(); } }
在啟動類中,需要將該類注冊進rest中,jersey啟動過程中會自動加載ExceptionHandler類,在調用者請求rest接口時,如果拋出異常,則由ExceptionHandler進行異常捕獲並統一處理約定格式錯誤信息給調用者
@ApplicationPath("/rest") public class MyApplication extends ResourceConfig { /** * MyApplication 構造方法 */ public MyApplication() { // 初始化Resource,以指定包的形式初始化,多個包之間以分號隔開 packages("com.timevale.esign.openapi.tech.resource"); // packages("com.timevale.esign.openapi.tech.opensvc.resource"); register(ExceptionHandler.class); // 注冊spring filter register(RequestContextFilter.class); // 注冊數據轉換器,支持傳參和返回信息json格式與bean之間的自動轉換 register(JacksonJsonProvider.class); // 注冊支持multipart-formdata格式的請求 register(org.glassfish.jersey.media.multipart.MultiPartFeature.class); // 初始化數據庫 EnvironmentInitializer.instance().initOnce(); } }
第二種方式,如果是以web.xml中配置jersey-spring的servlet實現的這種方式,指定jersey掃描自定義的ExceptionHandler所在的包即可,ExceptionHandler的實現同上。
<servlet> <servlet-name>jersey-spring</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>cn.tsign.www.openapi.rest.resource;cn.tsign.www.openapi.rest.filter</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet>