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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring boot集中異常處理方法實(shí)例

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

集中異常處理

以下代碼可在github獲?。篽ttps://github.com/Syske/learning-dome-code/tree/master/springboot-learning

方式一:ExceptionHandle

定義自己的異常類(lèi)型,根據(jù)不同類(lèi)型做不同處理,比如我定義的MyException:

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

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

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

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

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

上面的解釋已經(jīng)夠清楚了,就不做過(guò)多說(shuō)明了。剛剛我們說(shuō)了,上面的這種方式,對(duì)于filter是不起作用的,下面我們說(shuō)的這種方式,主要就是針對(duì)filter來(lái)說(shuō)的

方式二:ExceptionFilter

定義一個(gè)controller,請(qǐng)求路徑可以自己指定,比如/error/exthrow:

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

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

由于我把自己的filter交給shiro管理,而且是繼承BasicHttpAuthenticationFilter的,不知到什么原因,直接catch到的異常類(lèi)型是ServletException,為了拿到真正的異常信息,我需要通過(guò)getCause()方法獲取filter中拋出的異常。因?yàn)閏ontroller拋出的異常最后還是會(huì)交給我們定義的MyExceptionHandle去處理,如果獲取到的異常不是我們自定義的異?;蛘咚淖宇?lèi)的話(huà),就會(huì)返回500錯(cuò)誤(在這個(gè)示例前,我以為所有的filter都是這樣的,后來(lái)實(shí)踐后發(fā)現(xiàn)并不是這樣😂)。

@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); //將異常分發(fā)到/error/exthrow控制器 request.getRequestDispatcher('/error/exthrow').forward(request, response); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { }}

我的filter:

實(shí)現(xiàn)Filter接口:

public class MyFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { throw new MyException('MyFilter過(guò)濾器拋出異常'); //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配置類(lèi):

@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

其實(shí)spring boot原生提供了異常集中處理,我們經(jīng)常會(huì)看到:

Spring boot集中異常處理方法實(shí)例

但是這種方式不夠友好,而且大部分情況不滿(mǎn)足我們的需求,我們可以通過(guò)繼承這個(gè)controller,然后重寫(xiě)error方法或者errorHtml方法,或者兩個(gè)都重寫(xiě),區(qū)別是errorHtml是處理請(qǐng)求頭為text/html的請(qǐng)求發(fā)生的異常,而error是除了這個(gè)之外的其他異常。

下面是我定義的baseController,error部分返回的結(jié)果是空,還需要進(jìn)一步的研究:

@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, '未知錯(cuò)誤'), HttpStatus.OK); } @RequestMapping( produces = {'text/html'} ) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { HttpStatus status = this.getStatus(request); response.setStatus(status.value()); return null; } }

最后,對(duì)于以上問(wèn)題我最后的解決方法是繼承ErrorController,然后定義errorHtml和error,更重要的是@RequestMapping注解,然后在方法中response寫(xiě)入返回值,這種方式不夠優(yōu)雅:

@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('未知錯(cuò)誤', null))); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) {writer.close(); } } }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美激情麻豆| 精品伊人久久| 久久精品99久久无色码中文字幕| 成人国产精品| 日韩国产一区二区| 精品视频自拍| 欧美xxxx中国| 久久天堂av| 激情久久久久久久| 亚洲成人国产| 国产精品88久久久久久| 亚洲激情久久| 模特精品在线| 深夜日韩欧美| 国产精品1区| 国产黄大片在线观看| 久久精品动漫| 亚洲自拍另类| 日韩av资源网| 久久99久久人婷婷精品综合| 国内揄拍国内精品久久| 色综合www| 蜜桃久久av| 国产精品蜜月aⅴ在线| 国语精品一区| 激情视频一区二区三区| 亚洲欧美网站| 日韩av一区二区三区四区| 免费在线日韩av| 欧美sm一区| 蜜芽一区二区三区| 里番精品3d一二三区| 国产99精品| 亚洲精品成人一区| 精品国产乱码| 亚洲激情国产| 欧美在线黄色| 国产91在线精品| 日韩视频二区| 日本不卡视频在线观看| 久久精品国产久精国产| 99精品视频在线| 日本成人精品| 中文字幕高清在线播放| 视频一区二区三区中文字幕| 国产精品网在线观看| 亚洲五月婷婷| 国产亚洲精品精品国产亚洲综合| www.51av欧美视频| 视频一区视频二区在线观看| 精品淫伦v久久水蜜桃| 欧美精品九九| 国产精品久久国产愉拍| 九一精品国产| 欧美日本不卡| 欧美一区二区性| 国产欧美三级| 午夜精品一区二区三区国产| 国产亚洲人成a在线v网站| 香蕉久久99| 欧美国产先锋| 日本欧洲一区二区| 国产精品成久久久久| 日韩一区欧美二区| 国产精品久久观看| 亚洲精品免费观看| 丝袜av一区| 国产精品国码视频| 久久福利毛片| 日产精品一区二区| 免费人成精品欧美精品| 日韩一区电影| 国产精品一区二区av日韩在线| 欧美精品自拍| 最近高清中文在线字幕在线观看1| 亚洲精品无播放器在线播放| 久久精品高清| 蜜桃久久久久| 亚洲免费一区三区| 亚洲国产不卡| 日韩电影免费网址| 美女视频免费精品| 日韩精品免费一区二区夜夜嗨| 久久精品国内一区二区三区水蜜桃| 欧美一区二区三区免费看| 丝袜诱惑一区二区| 国产毛片久久久| 亚洲一区二区三区四区电影 | 欧美搞黄网站| 精品国产美女a久久9999| 日本中文字幕视频一区| 日韩亚洲在线| 欧美在线观看视频一区| 神马午夜在线视频| 国模精品一区| 国产精品手机在线播放| 日韩三级一区| 免费不卡在线观看| 婷婷中文字幕一区| 精品亚洲美女网站| 国产精品毛片久久| 国产成人免费av一区二区午夜| 欧美亚洲网站| 日韩美女国产精品| 亚洲精品乱码| 免费国产亚洲视频| 午夜久久影院| 亚洲一级黄色| 欧美日韩一二| 欧美aa国产视频| 激情欧美一区二区三区| 国产真实久久| 91精品亚洲| 亚洲综合在线电影| 欧美激情国产在线| 精品国产乱码久久久久久樱花| 久久伊人久久| 丰满少妇一区| 日本久久黄色| 97精品中文字幕| 国产网站在线| 国产精品字幕| 欧洲毛片在线视频免费观看| 亚洲黑丝一区二区| 午夜一区在线| 亚洲综合小说| 日韩国产在线一| 国产日韩欧美一区二区三区 | 精品三级在线| 精品精品国产三级a∨在线| 欧美激情麻豆| 国产一区调教| 成人羞羞在线观看网站| 欧美亚洲精品在线| 午夜久久影院| 一区二区三区四区在线观看国产日韩| 9色精品在线| 奶水喷射视频一区| 色狠狠一区二区三区| 国产欧美在线| 水蜜桃精品av一区二区| 久久精品二区三区| 视频一区免费在线观看| 日韩av影院| 麻豆国产欧美一区二区三区 | 日韩高清不卡在线| 国产欧美在线| 亚洲美女久久精品| 国产91精品对白在线播放| 国产亚洲永久域名| 日本成人精品| 国产一区二区亚洲| 欧美日韩精品免费观看视频完整| 国产精品美女久久久浪潮软件| 蜜桃91丨九色丨蝌蚪91桃色| 欧美日韩亚洲一区二区三区在线| 老色鬼精品视频在线观看播放| 三级在线看中文字幕完整版| 99成人在线| 91在线成人| 国产一区不卡| 欧美精品一二| 日本午夜精品一区二区三区电影 | 99久久亚洲精品蜜臀| 免费在线观看一区二区三区| 国产精品久久久亚洲一区| 久久97视频| 91精品二区| 欧美自拍一区| 精品日韩视频| 日韩一区二区三区高清在线观看| 国产精品高潮呻吟久久久久| 国产欧洲在线| 蜜臀a∨国产成人精品| 日韩精品欧美大片| 另类专区亚洲| 亚洲一区二区三区无吗| 国产一区二区三区网| 欧美日韩视频| 国产精品15p| 狠狠色狠狠色综合日日tαg| 国产欧美日韩视频在线 | 国产精品高颜值在线观看| 亚洲综合日本| 久久精品三级| 欧美综合二区| 精品一区二区三区中文字幕视频| 图片区亚洲欧美小说区| 青青草国产精品亚洲专区无| 日韩欧美精品综合| 日韩欧美高清一区二区三区| 97精品中文字幕| 日韩1区2区3区| 久久九九精品| 国产精品tv| 老牛国产精品一区的观看方式| 精品一区av| 亚洲人成网77777色在线播放| 麻豆网站免费在线观看| 午夜精品影视国产一区在线麻豆|