前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用@ControllerAdvice如何返回给前端对应错误码

使用@ControllerAdvice如何返回给前端对应错误码

作者头像
johnhuster的分享
发布2022-03-29 14:36:01
6990
发布2022-03-29 14:36:01
举报
文章被收录于专栏:johnhuster

@ControllerAdvice可以捕获spring应用下面未被捕获异常,下面是常见代码:

代码语言:javascript
复制
    @ExceptionHandler(value = Exception.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     public String errorHandler(Exception ex) {
         ApiResultVo<String> resultVo = new ApiResultVo<>();
         resultVo.setErrorCode(500);
         resultVo.setErrorMsg(ex.getMessage());
         return JSON.toJSONString(resultVo);
     }
 
     @ExceptionHandler(value = MyException.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     public String myExceptionHandler(MyException ex) {
         ApiResultVo<String> resultVo = new ApiResultVo<>();
         resultVo.setErrorCode(401);
         resultVo.setErrorMsg(ex.getMessage());
         return JSON.toJSONString(resultVo);
     }    

我们在对应异常处理的上面加上ResponseStatus注解就能将系统异常转换为对应的Http状态码,这部分工作由ResponseStatusExceptionResolver这个类完成,下面是关键代码:

代码语言:javascript
复制
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response,
             Object handler, Exception ex) {
        ResponseStatus responseStatus = AnnotatedElementUtils.findMergedAnnotation(ex.getClass(), ResponseStatus.class);
         if (responseStatus != null) {
             try {
                 return resolveResponseStatus(responseStatus, request, response, handler, ex);
             }
             catch (Exception resolveEx) {
                 logger.warn("Handling of @ResponseStatus resulted in Exception", resolveEx);
             }
         }
         else if (ex.getCause() instanceof Exception) {
             ex = (Exception) ex.getCause();
             return doResolveException(request, response, handler, ex);
         }
         return null;
     }
    protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request,
             HttpServletResponse response, Object handler, Exception ex) throws Exception {
        int statusCode = responseStatus.code().value();
         String reason = responseStatus.reason();
         if (!StringUtils.hasLength(reason)) {
 response.sendError(statusCode);
         }
         else {
             String resolvedReason = (this.messageSource != null ?
                     this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale()) :
                     reason);
             response.sendError(statusCode, resolvedReason);
         }
         return new ModelAndView();
     }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档