SpringMVC中怎么實現異常處理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
用于同一個 Controller 類下面方法異常捕獲,先看@ExceptionHandler源碼:
//該注解作用對象為方法
@Target({ElementType.METHOD})
//在運行時有效
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
//value()可以指定異常類
Class<? extends Throwable>[] value() default {};
}異常參數可以包括一般的異?;蜃远x異常,如果注解沒有指定異常類,會默認進行映射。
@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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。