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