温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringMVC中怎么实现异常处理

发布时间:2021-07-30 14:30:26 来源:亿速云 阅读:139 作者:Leah 栏目:大数据

SpringMVC中怎么实现异常处理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

@ExceptionHandler、@controlleradvice、HandlerExceptionResolver、ResponseEntityExceptionHandler、ErrorController

    1.@ExceptionHandler注解

用于同一个 Controller 类下面方法异常捕获,先看@ExceptionHandler源码:

//该注解作用对象为方法
@Target({ElementType.METHOD})
//在运行时有效
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
    //value()可以指定异常类
    Class<? extends Throwable>[] value() default {};
}

异常参数可以包括一般的异常或自定义异常,如果注解没有指定异常类,会默认进行映射。

@Controller
public class XttblogController {
    
    //自定义异常处理的方法
    @ExceptionHandler({Exception.class})
    public void exception(Exception e) {
        system.out.println("发生了异常")
    }

    //业务方法
    @RequestMapping("test")
    public void test() {
        throw new NullPointerException();
    }
}

当业务方法发生异常时,会自动捕获该异常并调用该类中的异常处理方法。

    2. @controlleradvice注解

@controlleradvice 注解适用于捕获全局异常,通过@controlleradvice加上@ExceptionHandler可以定义全局异常处理方法。官方也推荐用这种方式处理统一全局异常。

@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler{

    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public resultType businessExceptionHandler(BusinessException e){
        ....
        return resultType;
    }
    
    @ExceptionHandler(NullPointException.class)
    @ResponseBody
    public resultType exceptionHandler(Exception e){
       ....
       return resultType;
    }
}

通过这样可以掌控全局异常,当业务处理发生异常时,会自动捕获并调用相应的异常处理方法。建议继承ResponseEntityExceptionHandler来处理,该父类包括了很多已经被@ExceptionHandler注解标识的方法。另外,如果统一异常处理都需要返回json,那么可以使用@RestControllerAdvice注解来代替@ControllerAdvice,这样就可不需要添加@ResponseBody。

    3.HandlerExceptionResolver接口

HandlerExceptionResolver是Spring提供的一个接口。它也可以用来处理全局异常。异常处理类需要实现该接口,并作为组件@Component交给Spring管理

@Component
public class ExceptionResolver implements HandlerExceptionResolver{
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        var mv = new ModelAndView();
        mv.addObject("message","哎呀,一不小心出错了呀!");
        mv.setViewName("message");
        return mv;
    }
}

HandlerExceptionResolve 虽然能够处理全局异常,但是 Spring 官方不推荐使用它。

    4.ErrorController

ErrorController是一个接口,@controlleradvice只能处理进入@Controller标识后产生的异常,有时例如URL地址错误这种异常处理,就需要异常处理类实现 ErrorController来处理。

@Controller
public class InterfaceErrorController implements ErrorController {
    
    @Override
    public String getErrorPath() {
        return "/error";
    }
 
    /**
     * 处理来自web页面的错误
     */
    @RequestMapping(value=“/error”,produces="text/html")
    @ResponseBody
    public resultType errorPageHandler(HttpServletRequest request,HttpServletResponse response) {
        return resultType;
    }
 
    /**
     * 处理除web页面外的错误处理,比如json/xml等
     */
    @RequestMapping(value="/error")
    @ResponseBody
    public resultType errorApiHander(HttpServletRequest request) {
        return resultType;
    }
}

看完上述内容,你们掌握SpringMVC中怎么实现异常处理的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI