安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

SpringBoot统一处理全局异常

7月3日 小米粒投稿
  注解的介绍
  ControllerAdvice
  ControllerAdvice注解是Spring3。2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。
  这里ControllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行切面环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。ControllerAdvice是在类上声明的注解,其用法主要有三点:1。结合方法型注解ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的。
  2。结合方法型注解InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的。
  3。结合方法型注解ModelAttribute,表示其注解的方法将会在目标Controller方法执行之前执行。
  从上面的讲解可以看出,ControllerAdvice的用法基本是将其声明在某个bean上,然后在该bean的方法上使用其他的注解来指定不同的织入逻辑。不过这里ControllerAdvice并不是使用AOP的方式来织入业务逻辑的,而是Spring内置对其各个逻辑的织入方式进行了内置支持。针对声明ExceptionHandler、InitBinder或ModelAttribute方法的类的ComponentExceptionHandler,InitBinder在多个Controller类之间共享。
  使用ControllerAdvice注解的类可以明确声明为Springbean或通过类路径扫描自动检测。所有此类bean都根据Ordered语义或OrderPriority声明进行Ordered,Ordered语义优先于OrderPriority声明。然后在运行时按该顺序应用ControllerAdvicebean。但是请注意,实现PriorityOrderedControllerAdvicebean的PriorityOrdered不高于实现OrderedControllerAdvicebean。此外,Ordered不适用于范围内的ControllerAdvice例如,如果这样的bean已被配置为请求范围或会话范围的bean。对于处理异常,ExceptionHandler将在第一个具有匹配异常处理程序方法的通知中被选择。对于模型的属性和数据绑定初始化,ModelAttribute和InitBinder方法将遵循ControllerAdvice秩序。
  注意:对于ExceptionHandler方法,在特定建议bean的处理程序方法中,根异常匹配将优先于仅匹配当前异常的原因。但是,与较低优先级建议bean上的任何匹配(无论是根还是原因级别)相比,更高优先级建议上的原因匹配仍然是首选。因此,请在具有相应顺序的优先建议bean上声明您的主要根异常映射。
  默认情况下,ControllerAdviceControllerAdvice中的方法全局应用于所有控制器。使用诸如annotations、basePackageClasses和basePackages(或其别名value)之类的选择器来定义目标控制器的更窄子集。如果声明了多个选择器,则应用布尔OR逻辑,这意味着所选控制器应至少匹配一个选择器。请注意,选择器检查是在运行时执行的,因此添加许多选择器可能会对性能产生负面影响并增加复杂性。
  ExceptionHandler拦截异常并统一处理
  配合ExceptionHandler注解结合使用,当异常抛到controller层时,可以对异常进行统一的处理,规定返回的json格式或者跳转到指定的错误页面等。
  ExceptionHandler的作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。
  用于处理特定处理程序类和或处理程序方法中的异常的注解。
  使用此注解注释的处理程序方法允许具有非常灵活的签名。它们可能具有以下类型的参数,按任意顺序排列:
  异常参数:声明为一般异常或更具体的异常。如果注解本身没有通过其value()缩小异常类型,这也可用作映射提示
  代码实现
  自定义异常自定义一个异常类,用于处理我们发生的业务异常authorPromsing(张有博)version1。0。0since2021112720:14publicclassBizExceptionextendsRuntimeException{privatestaticfinallongserialVersionUID1L;错误码protectedStringerrorC错误信息protectedStringerrorMpublicBizException(){super();}publicBizException(FrontResulterrorInfoInterface){super(errorInfoInterface。getCode());this。errorCodeerrorInfoInterface。getMessage();this。errorMsgerrorInfoInterface。getMessage();}publicBizException(FrontResulterrorInfoInterface,Throwablecause){super(errorInfoInterface。getCode(),cause);this。errorCodeerrorInfoInterface。getCode();this。errorMsgerrorInfoInterface。getMessage();}publicBizException(StringerrorMsg){super(errorMsg);this。errorMsgerrorM}publicBizException(StringerrorCode,StringerrorMsg){super(errorCode);this。errorCodeerrorCthis。errorMsgerrorM}publicBizException(StringerrorCode,StringerrorMsg,Throwablecause){super(errorCode,cause);this。errorCodeerrorCthis。errorMsgerrorM}publicStringgetErrorCode(){returnerrorC}publicvoidsetErrorCode(StringerrorCode){this。errorCodeerrorC}publicStringgetErrorMsg(){returnerrorM}publicvoidsetErrorMsg(StringerrorMsg){this。errorMsgerrorM}publicStringgetMessage(){returnerrorM}OverridepublicThrowablefillInStackTrace(){}}
  统一异常处理
  importcom。tfjy。arbackend。enumtool。ResultCodeEimportcom。tfjy。arbackend。enumtool。ResutlMsgEimportcom。tfjy。arbackend。util。FrontRimportorg。slf4j。Limportorg。slf4j。LoggerFimportorg。springframework。web。bind。annotation。ControllerAimportorg。springframework。web。bind。annotation。ExceptionHimportorg。springframework。web。bind。annotation。ResponseBimportjavax。servlet。http。HttpServletRimportjava。io。IOEimportjava。net。InetAimportjava。net。UnknownHostEimportjava。sql。SQLE统一异常处理authorPromsing(张有博)version1。0。0since2021112720:14ControllerAdvice使用该注解表示开启了全局异常的捕获publicclassGlobalExceptionHandler{privatestaticfinalLoggerloggerLoggerFactory。getLogger(GlobalExceptionHandler。class);处理自定义的业务异常paramreqparamereturnExceptionHandler(valueBizException。class)ResponseBodypublicFrontResultbizExceptionHandler(HttpServletRequestreq,BizExceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(发生业务异常!原因是:{},e。getErrorMsg());returnFrontResult。getExceptionResult(e。getErrorCode(),e。getErrorMsg());}处理空指针的异常paramreqparamereturnExceptionHandler(valueNullPointerException。class)ResponseBodypublicFrontResultexceptionHandler(HttpServletRequestreq,NullPointerExceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(发生空指针异常!原因是:,e);returnFrontResult。getExceptionResult(ResultCodeEnum。FAIL。getCode(),ResutlMsgEnum。EXECUTEFAIL。getMsg());}处理索引越界异常paramreqparamereturnExceptionHandler(valueIndexOutOfBoundsException。class)ResponseBodypublicFrontResultexceptionHandler(HttpServletRequestreq,IndexOutOfBoundsExceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(索引越界异常!原因是:,e);returnFrontResult。getExceptionResult(ResultCodeEnum。FAIL。getCode(),ResutlMsgEnum。EXECUTEFAIL。getMsg());}处理类未找到异常paramreqparamereturnExceptionHandler(valueClassNotFoundException。class)ResponseBodypublicFrontResultexceptionHandler(HttpServletRequestreq,ClassNotFoundExceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(发生类未找到异常!原因是:,e);returnFrontResult。getExceptionResult(ResultCodeEnum。FAIL。getCode(),ResutlMsgEnum。EXECUTEFAIL。getMsg());}处理SQL异常paramreqparamereturnExceptionHandler(valueSQLException。class)ResponseBodypublicFrontResultexceptionHandler(HttpServletRequestreq,SQLExceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(发生SQL异常!原因是:,e);returnFrontResult。getExceptionResult(ResultCodeEnum。FAIL。getCode(),ResutlMsgEnum。EXECUTEFAIL。getMsg());}处理IO异常paramreqparamereturnExceptionHandler(valueIOException。class)ResponseBodypublicFrontResultexceptionHandler(HttpServletRequestreq,IOExceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(发生IO异常!原因是:,e);returnFrontResult。getExceptionResult(ResultCodeEnum。FAIL。getCode(),ResutlMsgEnum。EXECUTEFAIL。getMsg());}处理其他异常paramreqparamereturnExceptionHandler(valueException。class)ResponseBodypublicFrontResultexceptionHandler(HttpServletRequestreq,Exceptione){logger。error(URL:req。getRequestURL()。toString());logger。error(HTTPMETHOD:req。getMethod());logger。error(未知异常!原因是:,e);returnFrontResult。getExceptionResult(ResultCodeEnum。FAIL。getCode(),ResutlMsgEnum。EXECUTEFAIL。getMsg());}}
  前端返回值类
  importcom。tfjy。arbackend。enumtool。ResultCodeEimportlombok。AllArgsCimportlombok。Dimportlombok。NoArgsCDataAllArgsConstructorNoArgsConstructorpublicclassFrontResult{结果状态码privateS响应结果描述privateS返回数据privateO静态方法,返回前端实体结果paramcode状态码parammessage消息paramdata数据return前端实体结果publicstaticFrontResultbuild(Stringcode,Stringmessage,Objectdata){returnnewFrontResult(code,message,data);}返回成功的结果实体parammessage消息paramdata数据return实体publicstaticFrontResultgetSuccessResult(Stringmessage,Objectdata){FrontResultresultnewFrontResult();result。codeResultCodeEnum。SUCCESS。getCode();result。result。}返回无需data的成功结果实体parammessage消息内容return返回结果publicstaticFrontResultgetSuccessResultOnlyMessage(Stringmessage){FrontResultresultnewFrontResult();result。codeResultCodeEnum。SUCCESS。getCode();result。result。}获取一个异常结果paramcode错误码parammessage自定义异常信息returnFrontResultpublicstaticFrontResultgetExceptionResult(Stringcode,Stringmessage){FrontResultresultnewFrontResult();result。codecode。isEmpty()?ResultCodeEnum。CODEEXCEPTION。getCode():result。messagemessage。isEmpty()?ResultCodeEnum。CODEEXCEPTION。getMsg():}}importlombok。AllArgsCAllArgsConstructorpublicenumResultCodeEnum{请求成功SUCCESS(0000),请求失败FAIL(1111),EXCEL导入失败EXCELFAIL(1000),userID为空IDNULL(1001),前端传的实体为空MODELNULL(1002),更新失败UPDATEFAIL(1011),参数为空PARAMERROR(400),代码内部异常CODEEXCEPTION(500,代码内部异常);状态码privateSpublicStringgetCode(){}ResultCodeEnum(Stringcode){this。}privateSpublicStringgetMsg(){}}publicenumResutlMsgEnum{查询成功FINDSUCCESS(查询成功!),查询失败FINDFAIL(查询失败!),更新成功UPDATESUCCESS(更新成功),更新失败UPDATEFAIL(更新成功),SENDSUCCESS(发送成功),SENDFAIL(发送失败);privateSResutlMsgEnum(Stringmsg){this。}publicStringgetMsg(){}}
  测试用例测试用例authorPromsing(张有博)version1。0。0since202111299:05Api(tags{测试controller})RequestMapping(valuetestController)RestControllerpublicclassTestController{ApiOperation(value测试null)GetMapping(valuegetNull)publicFrontResultgetNull(){intlength0;Slengthname。length();returnFrontResult。build(ResultCodeEnum。SUCCESS。getCode(),ResutlMsgEnum。EXECUTESUCCESS。getMsg(),length);}}
  其他异常同理,也可以捕获。完美,没问题。全局统一异常处理设置成功。
投诉 评论 转载

荣耀畅玩8C荣耀畅玩8C手机机型:荣耀畅玩8C荣耀Play6T最新价格:1099元即将上市屏幕尺寸:6。26英寸6。7英寸屏幕类型:TFTLCDLCD屏幕色彩……铁路12306App也可购买汽车票来源:台海网台海网4月25日讯据厦门晚报报道12306铁路购票App近日推出了汽车票票务服务。旅客打开12306App,点击更多找到汽车票功能入口,在汽车票预订页输……SpringBoot统一处理全局异常注解的介绍ControllerAdviceControllerAdvice注解是Spring3。2中新增的注解,学名是Controller增强器,作用是给Contr……鸿蒙系统全面揭秘!腾讯开发工程师不吹不擂,带你深入剖析作者:michalliu,腾讯WXG客户端开发工程师华为鸿蒙OS有什么创新,是否自主研发完全开源,本文带你深入鸿蒙的世界。一、初识鸿蒙国内在计算机基础核心领域缺乏建……国产新巨头诞生从濒临破产到出货破5000万,逆袭三星夺全球第中国在早些年一直都面临着缺屏少芯的尴尬局面,由于屏幕以及芯片都是属于科技含量较高的产品,在早些年中国科技水平还较低的时候,确实很难实现国产化,但是如今随着华为、京东方等国产企业……iPhone13上新,拼多多百亿补贴最高直降500元金融界网9月17日消息,iPhone13要来了,拼多多百亿补贴上线苹果新品专区,聚焦iPhone13全系新品,包括iPhone13、iPhone13Pro、iPhone13Pr……无人机航拍装备,头条号创作收益2021。8。19拍摄于玉东湖畔一、寻找和创作素材1。发现美的眼睛:无人机航拍是一个载体,更重要的是有一双发现美的眼睛,对自然,对建筑,对人文历史和景观;……机器人姐姐格蕾丝会照顾你德国Bilder格蕾丝姐姐她看起来非常人性化,但不是她是是格蕾丝修女!一个穿着医院长袍的机器人应该会刺激医疗保健市场。格蕾丝尤其要照顾老人和被疫情隔离的人。……首个能传达人工触觉的多通道臂带问世新可穿戴设备助假手实现抓握自由科技日报讯(记者张梦然)使用当前的肌电假手,即使能够单独控制所有5个手指,用户一次只能做一个抓握动作。美国研究人员在《科学报告》上发表论文称……M1版本iPadPro内存细节,性能再强也只能用5GB运行内众所周知,苹果在前段时间推出的iPadProM1版本可以说是天下无敌,不仅仅在平板界没有对手,即使是在轻薄本中,其性能也是第一梯队的存在。而除了处理器强大之外,苹果在本次……RTX3050和GTX1660比怎么样,为什么我同学说他是智这两个性能差距不大,rtx3050稍稍强一点点,你可以把rtx3050看成有光追的gtx1660。你同学之所以说是智商检测卡是因为50结尾的N卡一般是1000元左右才对,……AI被用于俄乌战争细思极恐,人工智能人脸识别技术被首次用于俄乌战争了,而背后的数据源头来自于社交软件。近日,乌克兰方面宣布,俄罗斯近卫第8集团军司令莫尔德维乔中将在乌克兰的切尔诺巴耶夫卡被……
1150元拿下两年前旗舰手机,物超所值(第一期)为什么出现大量无症状感染者?怎么防控?张伯礼院士详解把激光雷达车干到20万元以内,小鹏P5要革燃油车的命具备原色量子点Pro技术的电视机哪个牌子好又耐用?报告称华为云在中国汽车云市场领跑魅族手机为何一蹶不振小米或有新机将出搭配骁龙870意思为小米CC系列这一周5家银行被罚3。66亿4家支付机构资格被取消围炉夜话,2nm芯片研发成功,看西方的产业布局腾讯迈出互联互通一小步对利益和筹码依然难割舍360借条还款纠纷现伤人案360官方回应一切案情以警方通报为iphone13参数价格对比苹果1313pro13proma

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利