• SpringBoot学习(三)


    一、单个 controller 范围的异常处理

    复制代码
     package com.xxx.secondboot.web;
    
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.xxx.secondboot.exception.MyExceptionResponse;
    
    import io.swagger.annotations.Api;
    
    @Api("测试controllerAdvice和全局异常处理")
    @RestController
    @RequestMapping("/advice1")
    public class AdviceController {
    
        @RequestMapping(value = "/test1", method = RequestMethod.GET)
        public String test1() {
            throw new RuntimeException("advice1 - exception1");
        }
    
        @RequestMapping(value = "/test2", method = RequestMethod.GET)
        public String test2() {
            throw new RuntimeException("advice1 - exception2");
        }
    
        @ExceptionHandler(RuntimeException.class)
        public MyExceptionResponse exceptionHandler() {
            MyExceptionResponse resp = new MyExceptionResponse();
            resp.setCode(300);
            resp.setMsg("exception-Handler");
            return resp;
        }
    
    }
    复制代码

    说明:

    • 在 controller 中加入被 @ExceptionHandler 修饰的类即可(在该注解中指定该方法需要处理的那些异常类)
    • 该异常处理方法只在当前的 controller 中起作用

    二、全部 controller 范围内起作用的异常处理(全局异常处理)

    1、全局异常处理类

    复制代码
    package com.xxx.secondboot.web;
    
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.xxx.secondboot.exception.MyExceptionResponse;
    import com.xxx.secondboot.exception.MyRuntimeException;
    
    //@ControllerAdvice(annotations=RestController.class)
    //@ControllerAdvice(basePackages={"com.xxx","com.ooo"})
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(RuntimeException.class)
        //    @ExceptionHandler(value={RuntimeException.class,MyRuntimeException.class})
        //    @ExceptionHandler//处理所有异常
        @ResponseBody //在返回自定义相应类的情况下必须有,这是@ControllerAdvice注解的规定
        public MyExceptionResponse exceptionHandler(RuntimeException e, HttpServletResponse response) {
            MyExceptionResponse resp = new MyExceptionResponse();
            resp.setCode(300);
            resp.setMsg("exception-Handler");
            //        response.setStatus(600);
            return resp;
        }
    }
    复制代码

    说明:

    • @ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
    • @ControllerAdvice 可以指定扫描范围
    • @ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用 @ResponseBody 进行 json 转换 
      • 返回 String,表示跳到某个 view
      • 返回 modelAndView
      • 返回 model + @ResponseBody

    2、controller

    复制代码
    package com.xxx.secondboot.web;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import io.swagger.annotations.Api;
    
    @Api("测试controllerAdvice和全局异常处理")
    @RestController
    @RequestMapping("/advice1")
    public class AdviceController {
    
        @RequestMapping(value = "/test1", method = RequestMethod.GET)
        public String test1() {
            throw new RuntimeException("advice1 - exception1");
        }
    
        @RequestMapping(value = "/test2", method = RequestMethod.GET)
        public String test2() {
            throw new RuntimeException("advice1 - exception2");
        }
    
        //    @ExceptionHandler(RuntimeException.class)
        //    public MyExceptionResponse exceptionHandler() {
        //        MyExceptionResponse resp = new MyExceptionResponse();
        //        resp.setCode(300);
        //        resp.setMsg("exception-Handler");
        //        return resp;
        //    }
    
    }
    复制代码

    注意:

    • 同一个异常被局部范围异常处理器和全局范围异常处理器同时覆盖,会选择小范围的局部范围处理器
    • 同一个异常被小范围的异常类和大范围的异常处理器同时覆盖,会选择小范围的异常处理器

    参考自:

  • 相关阅读:
    带横线圆圈标题
    锚点点击导航 跳转到相应位置,样式随之变化
    导航随滚动改变样式
    for循环中嵌套函数,执行顺序和结果该如何理解?
    mui 记录
    获取页面所有a标签href
    cookie记录横向滚动条位置
    Istio全景监控与拓扑
    Istio 流量治理功能原理与实战
    Cloud Native Weekly | KubeCon首登中国,华为云亮相KubeCon 2018,微软云服务又罢工
  • 原文地址:https://www.cnblogs.com/yujihaia/p/7367579.html
Copyright © 2020-2023  润新知