SpringMVC中怎么实现异常处理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
用于同一个 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(); } }
当业务方法发生异常时,会自动捕获该异常并调用该类中的异常处理方法。
@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。
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 官方不推荐使用它。
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中怎么实现异常处理的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。