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