范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringBootGlobalExceptionHandler全局异常处理器的使用

  作者:大卫不加班
  来源:https://blog.csdn.net/qq_36922927/article/details/82026683
  通常jsr303参数校验,由于返回的数据提示很不友好(bindException),
  需要定义全局异常拦截器,将信息友好的显示给用户  本文以处理登录为例
  定义全局异常拦截器:继承自RuntimeException
  GlobalExceptionHandler.java  import org.springframework.validation.BindException; @ControllerAdvice @ResponseBody public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class)     public Result exceptionHandler(HttpServletRequest request, Exception e){     //绑定异常是需要明确提示给用户的  if(e instanceof BindException){       BindException exception=(BindException) e;          List errors=exception.getAllErrors();          String msg=errors.get(0).getDefaultMessage();//获取自错误信息          return Result.error(CodeMsg.SERVER_BIND_ERROR.fillArgs(msg));          //将具体错误信息设置到CodeMsg中返回      } // 其余异常简单返回为服务器异常      return Result.error(CodeMsg.SERVER_ERROR);   } }
  由于之前的CodeMsg类,只接收code,msg参数构造CodeMsg对象,如果需要定制ErrorException的codeMsg,
  需要接收一个异常内容的参数:
  只需要添加一个生成异常CodeMsg对象的方法:CodeMsg fillArgs(Object ... args)
  CodeMsg.java  public class CodeMsg {    private int code;  private String msg;    //通用异常  public static CodeMsg SUCCESS = new CodeMsg(0, "success");  public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常"); //注意  %s ,格式化字符串  public static CodeMsg SERVER_BIND_ERROR = new CodeMsg(500101, "服务端绑定异常:%s");  //登录模块 5002XX  public static CodeMsg MSG_PASSWORD_IS_EMPTY = new CodeMsg(500201, "密码不能为空!");  public static CodeMsg MSG_MOBILE_ERROR = new CodeMsg(500202, "手机号格式不正确!");  public static CodeMsg MSG_MOBILE_IS_EMPTY = new CodeMsg(500203, "手机号不能为空!");  public static CodeMsg MSG_MOBILE_NOT_EXIST = new CodeMsg(500204, "手机号不存在!");  public static CodeMsg MSG_PASSWORD_ERROR = new CodeMsg(500205, "密码错误!");      //商品模块 5003XX    //订单模块 5004XX    //秒杀模块 5005XX      private CodeMsg(int code, String msg) {   this.code = code;   this.msg = msg;  }  /**   *@created   23:03 2018/8/24   *@author    wangwei   *@params   *@return     异常CodeMsg 对象生成方法  */    public CodeMsg fillArgs(Object ... args){   int code=this.code;   String message=String.format(msg,args);   return new CodeMsg(code,message);  }  public int getCode() {   return code;  }  public String getMsg() {   return msg;  } }
  在业务代码中专注处理业务,而不是返回各种CodeMsg(比如这里只需要知道登录时成功还是失败,其余情况直接抛出异常),可以直接抛出异常,添加一个全局异常类,根据CodeMsg来生成异常, 交由GlobalExceptionHandler全局异常处理器处理(在其中增加if条件分支即可):
  GlobalException.java  /**  * 全局异常类  */ @Data public class GlobalException extends RuntimeException{     private CodeMsg codeMsg;     public GlobalException(CodeMsg codeMsg){         super(codeMsg.toString());         this.codeMsg=codeMsg;       } } 看下效果:
  使用异常处理器之前,我处理登陆的service方法代码是这样的:   public CodeMsg login(LoginVal loginVal){         if(null==loginVal){            throw new GlobalException(CodeMsg.SERVER_ERROR);         }         String mobile=loginVal.getMobile();         String password=loginVal.getPassword();         MiaoshaUser user=miaoShaUserDao.getUserById(Long.parseLong(mobile));         if(null==user){             return CodeMsg.MSG_MOBILE_NOT_EXIST;         }         //        if(!user.getPassword().equals(MD5Util.formPassword2DbPass(password,user.getSalt())) ){            return CodeMsg.MSG_PASSWORD_ERROR;         }           return CodeMsg.SUCCESS;     }
  除此之外,controller方法:还有业务逻辑      public Result doLogin(@Valid LoginVal loginVal){        System.out.println("doLogin");        log.info(loginVal);         CodeMsg loginCodeMsg=userService.login(loginVal);        if(loginCodeMsg.getCode()!=0){             return Result.error(loginCodeMsg);        }          return Result.success("成功");     } 添加异常处理器之后:
  service的处理login的业务代码是这样的:  //登录的记过只想知道是true还是false,其余均是抛出全局异常,交由异常处理器处理  public boolean login(LoginVal loginVal){          if(null==loginVal){            throw new GlobalException(CodeMsg.SERVER_ERROR);         }         String mobile=loginVal.getMobile();         String password=loginVal.getPassword();         MiaoshaUser user=miaoShaUserDao.getUserById(Long.parseLong(mobile));         if(null==user){            throw new GlobalException( CodeMsg.MSG_MOBILE_NOT_EXIST);         }        if(!user.getPassword().equals(MD5Util.formPassword2DbPass(password,user.getSalt())) ){           throw  new GlobalException(CodeMsg.MSG_PASSWORD_ERROR);         }         return true;     }
  controller方法是这样的:无业务逻辑
  由于各种null,以及密码不正确等问题都在service抛出GlobalException,这里自然只能得到true    public Result doLogin(@Valid LoginVal loginVal){        System.out.println("doLogin");        log.info(loginVal);        userService.login(loginVal); //由于各种null,以及密码不正确等问题都在service抛出GlobalException,这里自然只能得到true        return Result.success(true);     } 修改全局异常处理器
  GlobalExceptionHandler.java是这样的:  @ControllerAdvice @ResponseBody public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class)     public Result exceptionHandler(HttpServletRequest request, Exception e){     //全局异常处理逻辑      if(e instanceof  GlobalException){          return Result.error(((GlobalException) e).getCodeMsg());      }      //绑定异常处理逻辑     else if(e instanceof BindException){       BindException exception=(BindException) e;          List errors=exception.getAllErrors();          String msg=errors.get(0).getDefaultMessage();          return Result.error(CodeMsg.SERVER_BIND_ERROR.fillArgs(msg));        }      return Result.error(CodeMsg.SERVER_ERROR);   } }
  看添加上异常处理器之后页面效果:
  存在的手机号是:12345678901,密码是123456
  1,手机号格式不正确
  2,密码错误
  3,手机号不存在
  4,手机号与密码均正确

表面上是性价比,本质上是中端机,原因并非价格,而是综合体验看文章听音乐是种享受,想听什么留言告知(都是付费无损包)性价比手机,从刚刚诞生就在很多人眼里是如下的状态看不起瞧不上。但正是这种看不起,瞧不上的态度,同时也让性价比手机成为目前的状油电混动车为啥不给绿牌?蔡清亮梅兰竹菊现在混动车省油可达40多,比插混节油而不能绿牌,国家怎么虑的?新能源不新能源不得要综合考虑碳排放,节油,而政府的工作不正是引导鼓励支持吗?夏老师分析一下。答因为混合动EVGA突然宣布终止与英伟达的合作不会推出GeForceRTX40系列显卡英伟达正在为新一代基于AdaLovelace架构的GeForceRTX40系列做最后的准备,这应该是英伟达板卡合作伙伴最为忙碌的时候。不过就在此时,却爆出了大新闻。EVGA官方邀请iphone14plus是不是智商机?北京时间2022年9月8日凌晨1点,苹果召开秋季新品发布会,发布了iPhone14iPhone14PlusiPhone14ProiPhone14ProMaxAppleWatchUl以太坊合并成功以太坊价格被市场定到哪里?就在最近,以太坊区块链经历了其整个开发生命周期中最重要的更新。尽管许多市场参与者预计,在合并之后,ETH的价格会飙升,但事情并没有按计划进行。更多资讯微薄团团财经这里详细了解。合并凯美特气再签稀有气体大单,基金抱团押注记者吴治邦编辑凯美特气(002549。SZ)在9月16日晚间对外披露了一则子公司岳阳凯美特电子特种稀有气体有限公司(以下简称凯美特电子特种气体公司)签订日常经营销售合同的公告。凯美3比0完胜浙江队北汽女排取得全锦赛开门红京报体育记者孔宁9月18日晚,在福建漳州举行的2022年全国女排锦标赛A组小组赛首场比赛中,少帅初辉指挥的北京汽车女排以3比0完胜浙江嘉善西塘古镇女排,赢得全锦赛开门红。两支球队都神舟系列飞船(神舟一号到十五号的历程)神舟十四号1992年9月21日,中央政治局常委会议决策实施中国载人航天工程(代号921工程),并确定了中国载人航天三步走的发展战略。第一步,发射载人飞船,建成初步配套的试验性载人飞神十四乘组仅隔16天再出舱,两个首次筑航天员安全防线9月17日,神舟十四号航天员乘组圆满完成第二次出舱活动。此次任务距离乘组首次出舱活动只过去16天,创下中国航天员两次出舱活动间隔时间最短纪录。神十四乘组短期内再出舱有何考量?此次出我国首次火星探测任务获丰富科学成果国家航天局9月18日消息,截至2022年9月15日,天问一号环绕器已在轨运行780多天,火星车累计行驶1921米,完成既定科学探测任务,获取原始科学探测数据1480GB。科学研究团神舟十四号航天员乘组第二次出舱活动全纪录央视网消息星空浩瀚无比,探索永无止境。古人手可摘星辰的梦想,如今在中国航天人求索太空路上变得不再遥不可及。放眼太空外,星河入梦来。目前,神舟十四号航天员乘组已经在中国空间站在轨生活
海南放宽限购政策刺激汽车消费今起可进入系统申请新海南客户端南海网南国都市报9月27日消息(记者王燕珍特约记者周平虎)为帮助企业纾困,省政府办公厅印发海南省稳经济助企纾困发展特别措施(2。0版),明确放宽限购政策大力刺激汽车消费PC散热系统下放拯救者Y70在极致纤薄中实现猛兽性能拯救者y70芯片领域有一个不变的真理,即在相同工艺下,芯片要实现更强的性能,就需要有更高的热功耗(TDP)设计。虽然芯片有较强的耐高温性能,但无论是PC还是手机,过高的温度都会造成2022年,内娱最恶心的性丑闻,不该被埋没一性,一直以来都是国人最羞于启齿的话题,但今年却成了内娱中最热门的主题。先是顶流李易峰因多次嫖娼被抓,从而就此倒下,葬送了自己的星途不说,还成了过街的老鼠,人人唾弃。就在李易峰霸占毛京波辞任林肯江湖路远,后会有期从昨天下午开始,毛京波辞任林肯的消息开始刷屏。大家的反应基本一样太突然了。当天,福特中国官方发布消息称,任命朱梅君女士为林肯中国总裁,向福特中国总裁兼首席执行官陈安宁和林肯全球总裁担心孩子被欺负?除了打回去,聪明的家长还会培养孩子惹不起大家好,我是神奇麻麻木小暖!幼儿园开学才半个多月,邻居家的俊俊就说什么也不去幼儿园了。俊俊哭着告诉妈妈,在幼儿园有人抢自己的玩具,有人推自己,前几天户外活动,还有人故意绊倒自己。俊家长注意!孩子隐匿性阴茎莫错当包皮过长近日,患儿杰杰(化名)的父母特意前往怀化市第一人民医院普通泌尿外科感谢科主任舒铁环。患儿因隐匿性阴茎在普通泌尿外科手术后,小鸡鸡终于出来了。今年8岁的患儿从出生开始小鸡鸡一直短小,孩子看不懂红楼梦?看这8幅高清全景图,就够了提起红楼梦,想必很多人耳熟能详。它是我国四大名著,更是一本可以读一辈子的生命之书,是中国人的族群生活史心灵史数千年汉语言魅力的一次总体绽放,渗透到我们生活的方方面面。对孩子而言,只新生儿常见的几个问题(特别家教1060期)为了在特殊时期为家长提供特别的家庭教育指导,全国妇联推出了特殊时期特别家教微信栏目,家长可以通过家庭教育微课学习家庭教育知识。新生儿常见的几个问题(特别家教1060期)1。新生儿的妈妈,我想玩手机?父母这样做,才是标准答案国家统计局2022年2月25日公布了一组数据,我国网民规模达10。32亿,而第七次人口普查显示全国人口共14。1178亿,也就是说,我国的网民已经占了总人口数的73,除了婴幼儿部分可怜天下父母心到今天刚好两个月,妹妹和妹夫被人陷害出事时就是2个月前的今天,我也为此抑郁了这么久,也一直徘徊在崩溃的边缘这么久!求人求关系求支援求菩萨求一切能化危为安的缝隙,但到今天还是徒劳望着一夜资讯詹姆斯力挺威少,周琦签约凤凰队,76人加码报价戈登北京时间9月27日,nba发生了一些非常有意思的事,现整理总结如下詹姆斯力挺威少,凯尔特人球员众志成城,周琦签约墨尔本凤凰队,锡安赢下总冠军才算成功。76人报价戈登筹码曝光1威少只