zoukankan      html  css  js  c++  java
  • SpringMVC中@ControllerAdvice/@RestControllerAdvice注解,全局异常处理

    参考:https://www.cnblogs.com/lenve/p/10748453.html
    http://doc.ruoyi.vip/ruoyi/document/htsc.html#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86
    @ControllerAdvice/@RestControllerAdvice:增强控制器,可以用来做 全局异常处理、全局数据绑定、全局数据预处理。
    1、ajax请求异常,返回类AjaxResult

    package com.jay.SpringBootStudy8.config;
    
    import java.util.HashMap;
    
    /**
     * 操作消息提醒
     *
     * @author ruoyi
     */
    public class AjaxResult extends HashMap<String, Object>
    {
        private static final long serialVersionUID = 1L;
    
        /**
         * 返回错误消息
         *
         * code 错误码
         * msg 内容
         * return 错误消息
         */
        public static AjaxResult error(String msg)
        {
            AjaxResult json = new AjaxResult();
            json.put("msg", msg);
            json.put("code", 500);
            return json;
        }
    
        /**
         * 返回成功消息
         */
        public static AjaxResult success(String msg)
        {
            AjaxResult json = new AjaxResult();
            json.put("msg", msg);
            json.put("code", 0);
            return json;
        }
    }
    

    2、自定义异常类

    package com.jay.SpringBootStudy8.config;
    /*
    自定义异常类
     */
    public class CustomerException extends Exception {
        private static final long serialVersionUID = 1L;
        protected final String message;
        public CustomerException(String msg) {
            this.message = msg;
        }
        @Override
        public String getMessage() {
            return message;
        }
    }
    

    3、全局异常处理类,其中判断是否是ajax请求,是用请求头信息来判断的,测试的时候注意,这个Handler需要用@RestControllerAdvice标注,使用@ControllerAdvice标注的话,ajax请求返回的是Exception而不是我们自定义的异常类了。

    package com.jay.SpringBootStudy8.config;
    
    import com.jay.SpringBootStudy8.utils.ServletUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    
    @RestControllerAdvice
    public class GlobalExceptionHandler {
        private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
        /**
         * 异常
         */
        @ExceptionHandler(CustomerException.class)
        public Object customerExceptionJson(HttpServletRequest request, CustomerException e)
        {
            String msg = e.getMessage();
            log.error(msg, e);
            if (ServletUtils.isAjaxRequest(request)){
                return AjaxResult.error(msg);
            }
            else{
                ModelAndView mv = new ModelAndView();
                mv.addObject("msg", msg);
                mv.setViewName("/error/500");
                return mv;
            }
        }
    }
    

    4、使用:throw new CustomerException("test data");
    5、判断是否ajax请求的类是从 若依 拷贝出来的

    package com.jay.SpringBootStudy8.utils;
    
    import java.io.IOException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import cn.hutool.core.convert.Convert;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    /**
     * 客户端工具类
     *
     * @author ruoyi
     */
    public class ServletUtils
    {
        /**
         * 获取String参数
         */
        public static String getParameter(String name)
        {
            return getRequest().getParameter(name);
        }
    
        /**
         * 获取String参数
         */
        public static String getParameter(String name, String defaultValue)
        {
            return Convert.toStr(getRequest().getParameter(name), defaultValue);
        }
    
        /**
         * 获取Integer参数
         */
        public static Integer getParameterToInt(String name)
        {
            return Convert.toInt(getRequest().getParameter(name));
        }
    
        /**
         * 获取Integer参数
         */
        public static Integer getParameterToInt(String name, Integer defaultValue)
        {
            return Convert.toInt(getRequest().getParameter(name), defaultValue);
        }
    
        /**
         * 获取request
         */
        public static HttpServletRequest getRequest()
        {
            return getRequestAttributes().getRequest();
        }
    
        /**
         * 获取response
         */
        public static HttpServletResponse getResponse()
        {
            return getRequestAttributes().getResponse();
        }
    
        /**
         * 获取session
         */
        public static HttpSession getSession()
        {
            return getRequest().getSession();
        }
    
        public static ServletRequestAttributes getRequestAttributes()
        {
            RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
            return (ServletRequestAttributes) attributes;
        }
    
        /**
         * 将字符串渲染到客户端
         *
         * @param response 渲染对象
         * @param string 待渲染的字符串
         * @return null
         */
        public static String renderString(HttpServletResponse response, String string)
        {
            try
            {
                response.setContentType("application/json");
                response.setCharacterEncoding("utf-8");
                response.getWriter().print(string);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 是否是Ajax异步请求
         *
         * @param request
         */
        public static boolean isAjaxRequest(HttpServletRequest request)
        {
            String accept = request.getHeader("accept");
            if (accept != null && accept.indexOf("application/json") != -1)
            {
                return true;
            }
    
            String xRequestedWith = request.getHeader("X-Requested-With");
            if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
            {
                return true;
            }
    
            String uri = request.getRequestURI();
            if (inStringIgnoreCase(uri, ".json", ".xml"))
            {
                return true;
            }
    
            String ajax = request.getParameter("__ajax");
            if (inStringIgnoreCase(ajax, "json", "xml"))
            {
                return true;
            }
            return false;
        }
        //最后这两个方法是从 若依 StringUtils中复制来的
        public static boolean inStringIgnoreCase(String str, String... strs)
        {
            if (str != null && strs != null)
            {
                for (String s : strs)
                {
                    if (str.equalsIgnoreCase(trim(s)))
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        /*
         去空格
         */
        public static String trim(String str)
        {
            return (str == null ? "" : str.trim());
        }
    }
    

      

  • 相关阅读:
    快速搭建一个本地的FTP服务器
    Node.js安装及环境配置之Windows篇
    在win10上安装oracle10g
    win10安装oracle11g客户端
    解决:Java source1.6不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符
    idea 右侧 无 meven 菜单
    idea导入maven项目不能识别pom.xml文件解决办法
    PostgresSQL客户端pgAdmin4使用
    PostgreSQL 创建数据库
    PostgreSQL 数据类型
  • 原文地址:https://www.cnblogs.com/xsj1989/p/15180792.html
Copyright © 2011-2022 走看看