重复功能我来写。在 SpringBoot
项目里都有全局异常处理以及返回包装等,返回前端是带上succ
、code
、msg
、data
等字段。单个项目状况下很好解决,当微服务模块多的状况下,不少状况开发都是复制原有代码进行构建另一个项目的,致使这些功能升级须要修改多个服务,在这个基础上,咱们封装了一个组件 unified-dispose-springboot-starter
里面包含了一些基础的异常处理以及返回包装功能。前端
添加依赖
ps: 实际version版本请使用最新版
最新版本: java
点击查看最新新版本git
<dependency> <groupId>com.purgeteam</groupId> <artifactId>unified-dispose-springboot-starter</artifactId> <version>0.1.1.RELEASE</version> </dependency>
启动类添加 @EnableGlobalDispose
注解开启如下功能。github
@EnableGlobalDispose @SpringBootApplication public class GlobalDisposeSpringBootApplication { public static void main(String[] args) { SpringApplication.run(GlobalDisposeSpringBootApplication.class, args); } }
在项目中常常出现系统异常的状况,好比NullPointerException
等等。若是默认未处理的状况下,springboot
会响应默认的错误提示,这样对用户体验不是友好,系统层面的错误,用户不能感知到,即便为500
的错误,能够给用户提示一个相似服务器开小差
的友好提示等。web
模块里以及包含了一些基本的异常处理方式(及不须要作任何代码编写已经具备基本异常处理),以及一些常见的异常code,用户只须要关心业务异常处理便可,直接经过 throw new 异常
的方式抛出便可。spring
# 通用500异常 Exception 类捕获 500 异常处理 # Feign 异常 FeignException 类捕获 ClientException 类捕获 # 业务自定义 BusinessException 类捕获 业务通用自定义异常 # 参数校验异常 HttpMessageNotReadableException 参数错误异常 BindException 参数错误异常
throw new BusinessException(BusinessErrorCode.BUSINESS_ERROR); // 或者 throw new BusinessException("CLOUD800","没有多余的库存");
一般不建议直接抛出通用的BusinessException异常,应当在对应的模块里添加对应的领域的异常处理类以及对应的枚举错误类型。json
如会员模块:
建立UserException
异常类、UserErrorCode
枚举、以及UserExceptionHandler
统一拦截类。segmentfault
UserException:springboot
@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 具备一些优秀的开源组件,减小平常的开发量。
示例代码地址: unified-dispose-springboot做者GitHub:
Purgeyao 欢迎关注qq交流群:
812321371
微信交流群:MercyYao
微信公众号: