千家信息网

SpringMVC中怎么实现异常处理

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,SpringMVC中怎么实现异常处理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。@ExceptionHandler、@controll
千家信息网最后更新 2025年02月01日SpringMVC中怎么实现异常处理

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

@ExceptionHandler、@controlleradvice、HandlerExceptionResolver、ResponseEntityExceptionHandler、ErrorController

1.@ExceptionHandler注解

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

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

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

@Controllerpublic 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可以定义全局异常处理方法。官方也推荐用这种方式处理统一全局异常。

@ControllerAdvicepublic 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管理

@Componentpublic 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来处理。

@Controllerpublic 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中怎么实现异常处理的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0