您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“springboot異常與重定向如何實現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“springboot異常與重定向如何實現(xiàn)”吧!
在spring中,有兩個重定向類型:
301,永久性跳轉(zhuǎn)
302,暫時性跳轉(zhuǎn)
默認調(diào)用302。
@RequestMapping("/redirect/[code]") public RedirectView redirectView(@PathVariable("code") int code, HttpSession session){ RedirectView red = new RedirectView("/",true); //判斷是不是301異常 if (code == 301){ //默認為302轉(zhuǎn)移,此處設(shè)置為永久性轉(zhuǎn)移 red.setStatusCode(HttpStatus.MOVED_PERMANENTLY); } return red; }
結(jié)果:
無論是訪問“redirect/301”還是“redirect/302”,結(jié)果都會跳轉(zhuǎn)到首頁,只是一個是301類型,一個是302類型。
@RequestMapping("/redirect/[code]") public RedirectView redirectView(@PathVariable("code") int code, HttpSession session){ //這種跳轉(zhuǎn)都是302跳轉(zhuǎn),通過一個redirect前綴告訴請求,要跳轉(zhuǎn)到首頁 //所有的redirect請求都會跳轉(zhuǎn)到首頁 return "redirect:/"; }
結(jié)果:
這種方式重定向,都是通過302的方式進行的,無論“redirect”后面的url是什么,因為只要識別到redirect這個前綴,就會跳轉(zhuǎn)到首頁。
1.重定向頁面 @RequestMapping("/redirect/[code]") public String redirectView(@PathVariable("code") int code, HttpSession session){ //這種跳轉(zhuǎn)都是302跳轉(zhuǎn),通過一個redirect前綴告訴請求,要跳轉(zhuǎn)到首頁 //所有的redirect請求都會跳轉(zhuǎn)到首頁 //通過session來傳遞信息 session.setAttribute("msg","Jump from redirect"); return "redirect:/"; } 2.首頁 @RequestMapping("/") @ResponseBody public String index(HttpSession session){ //在首頁中顯示重定向中的session return "Hello World!" + session.getAttribute("msg"); }
結(jié)果:
無論redirect后面的url是什么,都會返回首頁,并顯示相應的信息。
@RequestMapping("/admin") @ResponseBody public String admin(@RequestParam("key") String key){ //如果key=“admin” if ("admin".equals(key)){ return "hello admin"; } //否則拋出異常 throw new IllegalArgumentException("Key Wrong!"); }
結(jié)果:
在“key=admin”的時候,返回相應信息;在“key!=admin”的時候,返回錯誤信息。
@ExceptionHandler() @ResponseBody public String error(Exception e){ return "error:" + e.getMessage(); }
結(jié)果:
可以看出,在出現(xiàn)異常的時候,使我們自己定義的異常界面內(nèi)容,和4中的不同。
這里先對需要使用到的注解或者類進行說明,順便理清楚條理。
@ExceptionHandler:注解使用在方法上,值為指定某個異常,當該方法所在的controller出現(xiàn)的異常與注解的異常對應,則會觸發(fā)注解的方法。
下面這個controller一旦出現(xiàn)異常都會將異常捕獲轉(zhuǎn)給該方法進行處理
@RestController @RequestMapping("user") public class UserController { @ExceptionHandler(value = Exception.class) public void solveException(){ //異常處理邏輯 } }
@controllerAdvice: 注解在類上,注解的類會注冊到spring容器中,類中可有三種注解,@ExceptionHandler,@InitBinder,@ModelAttribute。該類下只要是注解上面三個注解的方法就是讓把方法應用到程序中所有帶有@RequesMapping注解的方法上。
流程 :
自定義一個自己的異常
聲明帶有@ControllerAdvice的類和@ExceptionHandler的方法,將@ExceptionHandler的方法應用到所有controller。
聲明一個返回結(jié)果類
聲明一個枚舉類,用來包含可能出現(xiàn)的異常類型
自定義異常:
@Data @AllArgsConstructor public class MyException extends RuntimeException{ private Integer code; private String msg; public MyException(ResultEnum resultEnum){ this.msg = resultEnum.getMsg(); this.code = resultEnum.getCode(); } }
自定義返回結(jié)果:
@Data @AllArgsConstructor @NoArgsConstructor public class Result { private int code; private String msg; }
枚舉類:
public enum ResultEnum { UNKNOW_ERROR(-1,"未知錯誤"), USER_ERROR(-2,"用戶信息錯誤"), SUCCESS(0,"成功"); private Integer code; private String msg; ResultEnum(Integer code, String msg) { this.code = code; this.msg = msg; } //省略getter和setter }
工具類:
public class ResultUtil { public static Result error(Integer code, String msg) { Result result = new Result(); result.setCode(code); result.setMsg(msg); return result; } }
自定義異常捕獲類:
@ControllerAdvice @Slf4j public class MyExceptionHandler { //接收的是Exception,也就是只要是異常都會執(zhí)行這方法 @ExceptionHandler(value=Exception.class) @ResponseBody public Result handle(Exception e){ if(e instanceof MyException){ MyException myException = (MyException) e; return ResultUtil.error(myException.getCode(),myException.getMsg()); }else{ return ResultUtil.error(-1,"未知錯誤"); } } }
controller類:
@RestController @RequestMapping("user") public class UserController { @GetMapping("exception") public void catchException() throws Exception{ throw new MyException(ResultEnum.USER_ERROR); } }
流程:
我們訪問http://localhost:8080/user/exception來訪問該方法,并拋出我們自定義的異常,通過枚舉類來進行對異常信息的集合。
通過自定義的異常捕獲類,來進行對異常的捕獲,執(zhí)行方法。
異常捕獲類的方法中,通過ResultUtil工具類來進行生成Result對象返回。
到此,相信大家對“springboot異常與重定向如何實現(xiàn)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。