zoukankan      html  css  js  c++  java
  • Spring 全局异常拦截根据业务返回不同格式数据 自定义异常

    1.全局异常拦截:针对所有异常进行拦截 可根据请求自定义返回格式

    2.自定义异常类 处理不同业务的异常

    接下来开始入手代码:

    1).自定义异常类

    @ControllerAdvice//添加注解 记得开启spring的全局扫描
    public class BusinessException extends RuntimeException {
        private static final long serialVersionUID = 2332608236621015980L;
    
    
        private String code;
        public BusinessException(String code,String message) {
            super(message);
            this.code = code;
        }
    
        public BusinessException() {
        }
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    }

    2).全局异常处理器(对拦截到的异常进行分类处理)

    /**
     * 全局异常处理器
     * @author chenhao
     */
    public class BusinessExceptionResolver implements HandlerExceptionResolver {
        /**日志log*/
        private static Logger log = LoggerFactory.getLogger(BusinessExceptionResolver.class);
    
        //系统抛出的异常
        @Override
        public ModelAndView resolveException(HttpServletRequest request,
                                             HttpServletResponse response, Object handler, Exception ex) {
            //handler就是处理器适配器要执行的Handler对象(只有method)
            //解析出异常类型。
            /*  使用response返回    */
            response.setStatus(HttpStatus.OK.value()); //设置状态码
            response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
            response.setCharacterEncoding("UTF-8"); //避免乱码
            response.setHeader("Cache-Control", "no-cache, must-revalidate");
            //如果该 异常类型是系统 自定义的异常,直接取出异常信息。
            BusinessException businessException=null;
            try {
            //根据请求方式返回不同的格式(根据自己的业务需求实现,如果只返回一种格式的不用判断)
            //统一返回json 自定义了返回Result类 引入了Jackson
    if ("application/json".equals(request.getContentType())){ if(ex instanceof BusinessException){ businessException = (BusinessException)ex; //错误信息 log.error(ex.getMessage(),ex); response.getWriter().write(Result.error(businessException.getCode(),ex.getMessage()).toString()); }else { log.error(ex.getMessage(),ex); response.getWriter().write(Result.error("-1", ex.getMessage()).toString()); } }else {
              //统一返回xml格式 Message message
    = new Message(Constants.RESULT_FAIL); message.setScript(ex.toString()); response.setContentType("text/xml"); response.getWriter().write(XmlUtil.objectToString(message)); } } catch (IOException e) { log.error("与客户端通讯异常:"+ e.getMessage(), e); e.printStackTrace(); } ModelAndView modelAndView=new ModelAndView(); return modelAndView; } }

    3).Spring配置文件添加

    springMVC启动加载时会将所有的异常处理HandlerExceptionResolver实现类存放到handlerExceptionResolvers一个map结构中。

    <bean id="exceptionResolver" class="com.*.exception.BusinessExceptionResolver"></bean>

    4).使用方式(我这里只针对JSON)

    返回格式:

    json格式:

    {
    "success": false,
    "errorcode": "10",
    "errormsg": "特征值不能为空",
    "data": null
    }

    xml格式:

    <?xml version="1.0" encoding="UTF-8"?>
    <Message code="00001" script="java.lang.NullPointerException" rowCount=""/>

    目前知道的还可以定义很多异常来让框架简易。多学学总没错。

  • 相关阅读:
    华为为什么再发布2016年就已经对外露脸甚至商用的欧拉操作系统。
    更安全,仅允许当前用户运行脚本法:vscode运行python时提示无法加载文件xxx.venvScriptsactivate.ps1
    ubuntu下安装odoo 14.0框架
    安利: Swagger工具, 一个REST APIs文档生成工具
    关注Brython 项目,在浏览器中运行python,部分替代javascript
    2021年最火的前端框架
    2021 最受欢迎的前端 八 个 UI 框架
    取代os.path的模块pathlib
    Java中Int转byte分析
    基于Java的时间转换:Date、Timestamp和String时间转化
  • 原文地址:https://www.cnblogs.com/AmbitiousMice/p/9054399.html
Copyright © 2011-2022 走看看