@ControllerAdvice全局异常捕捉失效的问题

今天,刚了解下SpringBoot的@ControllerAdvice与@ExceptionHanlder搭配就能实现全局捕捉异常的问题,但是当我信心满满将进入如下操作后,却发现不仅全局异常捕捉没有生效,而且原来的控制方法也全部失效,之前的控制方法可以访问的页面也都404

@ControllerAdvice
public class testController {
    public class ExceptionHanlder {
        @ExceptionHandler(Exception.class)
        public String a(Exception e){
            Logger logger= LoggerFactory.getLogger(getClass());
            logger.error("出错了"+e.getMessage());
            return e.getMessage();
        }
    }
    @RequestMapping("/")
    public String hello(){
      return "index";
    }
    @RequestMapping("/a")
    public String index(){
        int b=10/0;
        Logger logger= LoggerFactory.getLogger(getClass());
        logger.error("出错了++++=");
        return "a";
    }/**/

这是怎么回事呢,后面经过自己多次尝试,才发现@ControllerAdvice注解的类里面不能再写非异常出来的控制器方法,像上图操作会导致控制方法失效,页面访问404。

而造成这个原因就是

  只有当捕获异常后,才会进行这个@ControllerAdvice控制器类,而我们的异常定义在标有@ControllerAdvice的类非异常处理的控制器方法中。这样会陷入一个逻辑死循环
   因为要先进入到控制器方法中,就得执行异常语句才能进入这个@ControllerAdvice的类,而执行异常语句的控制器方法的类又刚刚好是与全局异常类是同一个类。所以会造成要执行异常语句等先进入@ControllerAdvice的类,而要先进入@ControllerAdvice的类,就要先执行异常语句这样的逻辑死锁当中
   最后的结果就是所有页面跳转的控制器方法全部失效,页面访问404,全局异常捕捉也失去作用(因为根本就没异常)

   最后解决将非异常处理的控制方法与全局异常捕捉放在不同的类中,在用@Controller与@ControllerAdvice分别注解:

package com.example.testdevtools.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
public class testController {
    @RequestMapping("/")
    public String hello(){
      return "index";
    }
    @RequestMapping("/a")
    public String index(){
        int b=10/0;
        Logger logger= LoggerFactory.getLogger(getClass());
        logger.error("出错了++++=");
        return "a";
    }/**/
}/**/
package com.example.testdevtools.ExceptionController;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ExceptionHanlder {
    @ExceptionHandler(Exception.class)
    public String a(Exception e){
        Logger logger= LoggerFactory.getLogger(getClass());
        logger.error("出错了"+e.getMessage());
        return e.getMessage();
    }
}

你可能感兴趣的:(java,spring,boot)