Jersey统一异常处理

时间:2022-05-01 19:33:02

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