眾所周知,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>
