zoukankan      html  css  js  c++  java
  • Jersey统一异常处理

      众所周知,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>
  • 相关阅读:
    人月神话阅读笔记之一
    第一阶段冲刺站立会议报告——9
    第一阶段冲刺站立会议报告——8
    第一阶段冲刺站立会议报告——7
    第一阶段冲刺站立会议报告——6
    第一阶段冲刺站立会议报告——5
    第二阶段冲刺第一天
    寻找水王2
    构建之法阅读笔记05
    第十二周学习进度条
  • 原文地址:https://www.cnblogs.com/HEWU10/p/5858099.html
Copyright © 2011-2022 走看看