重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章给大家分享的是有关如何理解SpringBoot异常处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
公司主营业务:成都网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出邻水免费做网站回馈大家。
重复功能我来写。在 SpringBoot
项目里都有全局异常处理以及返回包装等,返回前端是带上succ
、code
、msg
、data
等字段。单个项目情况下很好解决,当微服务模块多的情况下,很多情况开发都是复制原有代码进行构建另外一个项目的,导致这些功能升级需要修改多个服务,在这个基础上,我们封装了一个组件 unified-dispose-springboot-starter
里面包含了一些基础的异常处理以及返回包装功能。
添加依赖 ps:实际version版本请使用最新版
com.purgeteam unified-dispose-springboot-starter 0.1.1.RELEASE
启动类添加 @EnableGlobalDispose
注解开启以下功能。
@EnableGlobalDispose @SpringBootApplication public class GlobalDisposeSpringBootApplication { public static void main(String[] args) { SpringApplication.run(GlobalDisposeSpringBootApplication.class, args); } }
在项目中经常出现系统异常的情况,比如NullPointerException
等等。如果默认未处理的情况下,springboot
会响应默认的错误提示,这样对用户体验不是友好,系统层面的错误,用户不能感知到,即使为500
的错误,可以给用户提示一个类似服务器开小差
的友好提示等。
模块里以及包含了一些基本的异常处理方式(及不需要做任何代码编写已经具有基本异常处理),以及一些常见的异常code,用户只需要关心业务异常处理即可,直接通过 throw new 异常
的方式抛出即可。
# 通用500异常 Exception 类捕获 500 异常处理 # Feign 异常 FeignException 类捕获 ClientException 类捕获 # 业务自定义 BusinessException 类捕获 业务通用自定义异常 # 参数校验异常 HttpMessageNotReadableException 参数错误异常 BindException 参数错误异常
throw new BusinessException(BusinessErrorCode.BUSINESS_ERROR); // 或者 throw new BusinessException("CLOUD800","没有多余的库存");
通常不建议直接抛出通用的BusinessException异常,应当在对应的模块里添加对应的领域的异常处理类以及对应的枚举错误类型。
如会员模块: 创建UserException
异常类、UserErrorCode
枚举、以及UserExceptionHandler
统一拦截类。
UserException:
@Data public class UserException extends RuntimeException { private String code; private boolean isShowMsg = true; /** * 使用枚举传参 * * @param errorCode 异常枚举 */ public UserException(UserErrorCode errorCode) { super(errorCode.getMessage()); this.setCode(errorCode.getCode()); } }
UserErrorCode:
@Getter public enum UserErrorCode { /** * 权限异常 */ NOT_PERMISSIONS("CLOUD401","您没有操作权限"), ; private String code; private String message; CommonErrorCode(String code, String message) { this.code = code; this.message = message; } }
UserExceptionHandler:
@Slf4j @RestControllerAdvice public class UserExceptionHandler { /** * UserException 类捕获 */ @ExceptionHandler(value = UserException.class) public Result handler(UserException e) { log.error(e.getMessage(), e); return Result.ofFail(e.getCode(), e.getMessage()); } }
最后业务使用如下:
// 判断是否有权限抛出异常 throw new UserException(UserErrorCode.NOT_PERMISSIONS);
上述方式,抛出异常后会被模块处理。前台返回如下:
{ "succ": false, // 是否成功 "ts": 1566467628851, // 时间戳 "data": null, // 数据 "code": "CLOUD800", // 错误类型 "msg": "业务异常", // 错误描述 "fail": true }
在REST风格的开发中,避免通常会告知前台返回是否成功以及状态码等信息。这里我们通常返回的时候做一次util
的包装处理工作,如:Result
类似的类,里面包含succ
、code
、msg
、data
等字段。
接口调用处理类似如下:
@GetMapping("hello") public Result list(){ return Result.ofSuccess("hello"); }
结果:
{ "succ": ture, // 是否成功 "ts": 1566467628851, // 时间戳 "data": "hello", // 数据 "code": null, // 错误类型 "msg": null, // 错误描述 "fail": true }
默认情况所有的 web controller
都会被封装为一下返回格式。
接口:
@GetMapping("test") public String test(){ return "test"; }
返回
{ "succ": true, // 是否成功 "ts": 1566386951005, // 时间戳 "data": "test", // 数据 "code": null, // 错误类型 "msg": null, // 错误描述 "fail": false }
@IgnorReponseAdvice
允许范围为:类 + 方法,标识在类上这个类下的说有方法的返回都将忽略返回封装。
接口:
@IgnorReponseAdvice // 忽略数据包装 可添加到类、方法上 @GetMapping("test") public String test(){ return "test"; }
返回 test
项目里很多重复的code,我们可以通过一定的方式去简化,以达到一定目的减少开发量。PurgeTeam 具有一些优秀的开源组件,减少日常的开发量。
以上就是如何理解SpringBoot异常处理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。