SpringMVC中怎么实现异常处理

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

创新互联建站是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十载时间我们累计服务了上千家以及全国政企客户,如成都搬家公司等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致称赞。

@ExceptionHandler、@controlleradvice、HandlerExceptionResolver、ResponseEntityExceptionHandler、ErrorController

    1.@ExceptionHandler注解

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

//该注解作用对象为方法
@Target({ElementType.METHOD})
//在运行时有效
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
    //value()可以指定异常类
    Class[] 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中怎么实现异常处理的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


网页标题:SpringMVC中怎么实现异常处理
本文地址:http://scyanting.com/article/jjpici.html