日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring boot集中異常處理方法實例

瀏覽:146日期:2023-09-10 14:42:48

集中異常處理

以下代碼可在github獲取:https://github.com/Syske/learning-dome-code/tree/master/springboot-learning

方式一:ExceptionHandle

定義自己的異常類型,根據不同類型做不同處理,比如我定義的MyException:

public class MyException extends RuntimeException { public MyException(String msg) { super(msg); }}

然后通過MyExceptionHandle處理該異常,需要注意的是異常不能在filter中拋出,拋出也沒法捕獲

@RestControllerAdvicepublic class MyExceptionHandle { @ExceptionHandler(MyException.class) public Result exceptionHandle(MyException e) { return Result.getFailed( 'system error:MyException' + e.getMessage()); }}

在controller、service以及攔截器的預處理方法中都可以完美捕獲,這里特殊說下攔截器:

public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { //throw new MyException('攔截器錯誤:MyInterceptor'); // 這里的異常會完美捕獲,并返回 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { throw new MyException('攔截器錯誤:MyInterceptor'); /** 能捕獲異常信息并返回給客戶端,但并不會覆蓋已經請求成功的返回結果,但會包含在返回結果中,比如我的返回結果: {'code':1,'success':true,'msg':'請求成功','result':true}{'code':0,'success':false,'msg':'system error:MyException攔截器錯誤:MyInterceptor','result':null} */ } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { throw new MyException('攔截器錯誤:MyInterceptor'); // 這里拋出的異常并不能被捕獲,會直接在后臺拋出,相當于回掉函數,請求結果已經返回 }}

上面的解釋已經夠清楚了,就不做過多說明了。剛剛我們說了,上面的這種方式,對于filter是不起作用的,下面我們說的這種方式,主要就是針對filter來說的

方式二:ExceptionFilter

定義一個controller,請求路徑可以自己指定,比如/error/exthrow:

@Controllerpublic class ExceptionController { @RequestMapping('/error/exthrow') public void rethrow(HttpServletRequest request) throws Exception { throw ((Exception) request.getAttribute('filter.error')); }}

再定義一個異常攔截器,在需要拋出異常的攔截器中直接拋出異常,然后在異常攔截器中try-catch,發生異常時直接轉發至前面定義的異常controller,這里需要注意的是,如果你的filter是實現Filter或者繼承OncePerRequestFilter,那你不需要任何處理,直接request.setAttribute('filter.error', e)就可以了。

由于我把自己的filter交給shiro管理,而且是繼承BasicHttpAuthenticationFilter的,不知到什么原因,直接catch到的異常類型是ServletException,為了拿到真正的異常信息,我需要通過getCause()方法獲取filter中拋出的異常。因為controller拋出的異常最后還是會交給我們定義的MyExceptionHandle去處理,如果獲取到的異常不是我們自定義的異常或者他的子類的話,就會返回500錯誤(在這個示例前,我以為所有的filter都是這樣的,后來實踐后發現并不是這樣😂)。

@Componentpublic class ExceptionFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { chain.doFilter(request, response); } catch (Exception e) { request.setAttribute('filter.error', e); //將異常分發到/error/exthrow控制器 request.getRequestDispatcher('/error/exthrow').forward(request, response); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { }}

我的filter:

實現Filter接口:

public class MyFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { throw new MyException('MyFilter過濾器拋出異常'); //filterChain.doFilter(servletRequest, servletResponse); } }

filter2繼承OncePerRequestFilter:

public class MyFilter2 extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { throw new MyException('MyFilter2異常'); }}

filter配置類:

@Bean public FilterRegistrationBean myFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); registration.setName('myFilter'); registration.addUrlPatterns('/*'); //此處盡量小,要比其他Filter靠前 registration.setOrder(1); return registration; } @Bean public FilterRegistrationBean myFilter2Registration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter2()); registration.setName('myFilter2'); registration.addUrlPatterns('/*'); //此處盡量小,要比其他Filter靠前 registration.setOrder(2); return registration; } /** * 配置攔截器 * @return */ @Bean public FilterRegistrationBean exceptionFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new ExceptionFilter()); registration.setName('exceptionFilter'); //此處盡量小,要比其他Filter靠前 registration.setOrder(-1); return registration; }

方式三:BasicErrorController

其實spring boot原生提供了異常集中處理,我們經常會看到:

Spring boot集中異常處理方法實例

但是這種方式不夠友好,而且大部分情況不滿足我們的需求,我們可以通過繼承這個controller,然后重寫error方法或者errorHtml方法,或者兩個都重寫,區別是errorHtml是處理請求頭為text/html的請求發生的異常,而error是除了這個之外的其他異常。

下面是我定義的baseController,error部分返回的結果是空,還需要進一步的研究:

@RestController@RequestMapping(value = 'error')public class MyBaseErrorController extends BasicErrorController { public MyBaseErrorController(ErrorAttributes errorAttributes) { super(errorAttributes, new ErrorProperties()); } @Override @RequestMapping(produces = {MediaType.ALL_VALUE}) public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { return new ResponseEntity<Map<String, Object>>(Result.failedResultMap(000, '未知錯誤'), HttpStatus.OK); } @RequestMapping( produces = {'text/html'} ) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { HttpStatus status = this.getStatus(request); response.setStatus(status.value()); return null; } }

最后,對于以上問題我最后的解決方法是繼承ErrorController,然后定義errorHtml和error,更重要的是@RequestMapping注解,然后在方法中response寫入返回值,這種方式不夠優雅:

@RestController@RequestMapping(value = 'error')public class MyBaseErrorController implements ErrorController { private static final String path_default = '/error'; @Autowired private ErrorAttributes errorAttributes; @RequestMapping(produces = {MediaType.ALL_VALUE}) public void error(HttpServletRequest request, HttpServletResponse response) { setJsonError(response); } @RequestMapping( produces = {'text/html'} ) public void errorHtml(HttpServletRequest request, HttpServletResponse response) { setJsonError(response); } @Override public String getErrorPath() { return path_default; } private void setJsonError(HttpServletResponse response) { PrintWriter writer = null; try { response.setStatus(200); response.setHeader('Content-type', 'text/html;charset=UTF-8'); response.setCharacterEncoding('UTF-8'); writer = response.getWriter(); writer.write(JSON.toJSONString(Result.getFailed('未知錯誤', null))); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) {writer.close(); } } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精选久久| 日本在线视频一区二区| 日韩精品高清不卡| 免费成人在线观看| 日韩天堂av| 欧美日韩国产高清电影| 色爱av综合网| 亚洲综合在线电影| 日韩av免费| 久久久久国产| 五月天综合网站| 欧美日韩精品一本二本三本| 激情综合激情| 日韩午夜高潮| 一本综合精品| 日韩av二区在线播放| 欧美日韩一区二区三区四区在线观看| 日韩精品a在线观看91| 欧美在线不卡| 欧美成人精品午夜一区二区| 精品日本视频| 免费高潮视频95在线观看网站| 电影亚洲精品噜噜在线观看| 久久精品国产www456c0m| 99国产精品私拍| 亚洲69av| 精品精品99| 国产99久久| 久久一二三区| 国产美女亚洲精品7777| 不卡专区在线| 久久一区二区三区电影| 另类激情亚洲| 国产精品亲子伦av一区二区三区| 精品日韩一区| 久久中文字幕二区| 在线日韩成人| 免费在线成人| 久久伦理在线| 久久国产日韩欧美精品| 国产极品嫩模在线观看91精品| 日本久久黄色| 免费黄色成人| 日韩高清不卡一区| 国产成人精品一区二区三区在线| 少妇久久久久| 亚洲综合福利| 国产伦精品一区二区三区视频| 日韩中文在线电影| 亚洲青青久久| 亚洲精品在线影院| 蜜臀精品久久久久久蜜臀| 国产欧美精品久久| 一区二区三区视频免费观看| 日本一区福利在线| аⅴ资源天堂资源库在线| 国产手机视频一区二区| 欧美精品97| 国产视频一区免费看| 久久久久亚洲精品中文字幕| 欧美日韩国产亚洲一区| 国产精品欧美日韩一区| 超碰在线99| 日韩在线观看一区二区| 国产一区日韩| 中文一区一区三区免费在线观 | 亚洲91视频| 日韩一区二区三区四区五区| 黑人精品一区| 丝袜亚洲另类欧美| 国产成人免费| 日本国产亚洲| 九色porny丨国产首页在线| 日韩精品乱码av一区二区| 日韩欧美不卡| 国产欧美在线观看免费| 亚洲激精日韩激精欧美精品| 国产精品18| 日韩精品一卡二卡三卡四卡无卡| 国内精品伊人| 亚洲精品第一| 日韩在线欧美| 国产精品成人国产| 亚洲专区在线| www.九色在线| 麻豆精品视频在线| 欧美永久精品| 免费看日韩精品| 美女亚洲一区| 天堂8中文在线最新版在线| 欧美一区免费| 亚洲精品中文字幕99999| 图片区亚洲欧美小说区| 肉色欧美久久久久久久免费看| 国产精品资源| 日韩激情中文字幕| 九色精品91| 九色porny丨国产首页在线| 麻豆国产精品视频| 91麻豆精品激情在线观看最新| 免费日韩av| 免费视频一区三区| 日韩欧美综合| 国产精品国产三级国产在线观看| 国产无遮挡裸体免费久久| 亚洲精品免费观看| 亚洲资源网站| 在线精品福利| 性一交一乱一区二区洋洋av| 免费久久精品| 91精品亚洲| 精品国产亚洲日本| 国产日本亚洲| 国产亚洲人成a在线v网站| 午夜电影一区| 日本不卡视频在线| 亚洲精品视频一二三区| 综合激情一区| 蜜臀久久久久久久| 蜜桃视频一区二区| 亚洲午夜国产成人| 中文字幕亚洲影视| 亚洲精品人人| 日韩精品亚洲一区二区三区免费| 视频一区中文字幕精品| 日韩美女国产精品| 亚洲一区av| 日韩激情精品| 国产精品久久久久久久久久白浆 | 欧美精品影院| 久久狠狠久久| 国产精品亚洲产品| 国产精品一区二区精品视频观看 | 国产乱码精品| 国产欧美日本| 精品久久久久中文字幕小说| 国产资源在线观看入口av| 91中文字幕精品永久在线| caoporn视频在线| 天堂8中文在线最新版在线| 日韩成人亚洲| 欧美午夜不卡| 99成人在线| 亚洲美女久久| 国产调教精品| 成人国产综合| 国产精品99免费看| 鲁大师成人一区二区三区| 免费一级片91| 国产欧美一级| 国产成人精品免费视| 日本久久成人网| 视频一区欧美精品| 国产精品一区二区三区www| 美女av在线免费看| 欧美不卡视频| 日韩精品欧美大片| 国产一区二区三区视频在线| 日韩精品免费一区二区在线观看| 伊人精品在线| 欧美日韩 国产精品| 国产96在线亚洲| 欧美粗暴jizz性欧美20| 亚洲少妇诱惑| 国产精品嫩模av在线| 成人精品中文字幕| 综合在线一区| 精品国产99| 亚洲激情偷拍| 国产精品nxnn| 久久五月天小说| 欧美日韩18| 久久久人人人| 日韩精品一区二区三区av| 三上亚洲一区二区| 麻豆亚洲精品| 成人在线视频中文字幕| 日韩午夜av| 国产精品三级| 99热精品在线| 久久精品国产99国产| 狠狠爱www人成狠狠爱综合网| 国产麻豆一区| av成人国产| 精品99久久| 一区二区高清| av一区在线| 国产精品入口久久| 国产亚洲亚洲| 日韩av二区| 日韩欧美中文字幕在线视频| 伊人网在线播放| 69堂免费精品视频在线播放| а√在线中文在线新版| 日本在线观看不卡视频| 伊人久久大香线蕉av不卡| 国产精品极品在线观看| 香蕉精品999视频一区二区| 97在线精品| 国产日本精品|