spring-base
Gitee地址
对springBoot项目的一些通用操作进行的封装,包括如下几个部分:
- 统一的异常捕获
- 统一的JSON返回格式
- 统一的权限接口扫描:@Privilege 被注解的请求会在项目启动时被扫描处理,此注解需要配合@RequestMapping使用
- 这个基础模块在构建SpringBoot项目时给我带来了很大的方便,添加依赖就可以轻松构建标准的SpringBoot项目
使用方法
-
首先下载源代码使用maven安装到本地仓库,可修改springBoot(2.3.10.RELEASE)以及springCloud(Hoxton.SR11)版本。
-
在pom.xml中设置父项目和基础依赖
<!--设置父项目为本项目--> <parent> <groupId>gaozhi.online</groupId> <artifactId>spring-base</artifactId> <version>1.0</version> </parent> <!--添加基础依赖--> <dependencys> <dependency> <groupId>gaozhi.online</groupId> <artifactId>spring-parent</artifactId> <version>1.0</version> </dependency> </dependencys>
简单应用到项目
-
统一结果格式:在新项目的Application中添加包扫描配置即可自动将Controller层返回结果封装为JSON
@SpringBootApplication //添加基础包(gaozhi.online.parent.ScanClass.class)的扫描;可以添加自身项目的扫描路径 @ComponentScan(basePackageClasses = {gaozhi.online.parent.ScanClass.class,Application.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } }
统一返回结果部分格式如下:
//格式 { "code": 200(返回码), "message": "请求成功"(提示信息), "data": "{\"id\":2147483648}" (返回对象的json串) } //实例 { "code": 200, "message": "请求成功", "data": "{\"id\":2147483648,\"headUrl\":\"https://gimg2.baidu.com/image_search/src\\u003dhttp%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fblog%2F202107%2F17%2F20210717232533_2edcf.thumb.1000_0.jpg\\u0026refer\\u003dhttp%3A%2F%2Fc-ssl.duitang.com\\u0026app\\u003d2002\\u0026size\\u003df9999,10000\\u0026q\\u003da80\\u0026n\\u003d0\\u0026g\\u003d0n\\u0026fmt\\u003dauto?sec\\u003d1651719991\\u0026t\\u003d7765c89c73904f25968e23b718075a8b\",\"nick\":\"张三2\",\"remark\":\"快乐p2p\",\"gender\":\"male\",\"birth\":0,\"email\":\"lfc_guest@163.com\",\"createTime\":1634974238958,\"updateTime\":1649048839660,\"banTime\":0,\"status\":1,\"vip\":0}" }
-
统一异常处理:在接口逻辑任意地方抛出的运行时异常都将被捕获并封装为JSON格式,推荐实现BusinessRuntimeException接口编写自定义异常并枚举异常类型。
- 枚举异常:
/** * @description(3000 服务异常枚举) * @author: gaozhi.online * @createDate: 2021/3/15 0015 * @version: 1.0 */ public enum ServerExceptionEnum implements Result.ResultEnum { API_ERROR(-4, "API异常"), GENERAL_ERROR(-1, "未处理的全局服务器异常 Exception"), PROPERTY_VALIDATE_ERROR(-2, "属性校验未通过"), QPS_ERROR(-3, "异常访问"); private final int code; private final String message; ServerExceptionEnum(int code, String message) { this.code = code; this.message = message; } @Override public int code() { return code; } @Override public String message() { return message; } @Override public String type() { return ServerExceptionEnum.class.getName(); } }
- 抛出异常:
userInfo = userService.findUserInfo(userId); if (userInfo == null) { //推荐实现 throw new BussinessException(UserExceptionEnum.USER_NOT_EXIST,"其余附加信息"); }
-
权限列表的扫描,会在项目启动时扫描一次被@Privilege注解的接口,可以动态的更新权限的列表
- 添加注解
/**对类添加@Privilege注解,标识此类中有需要扫描的方法*/ @Privilege @Validated @RestController @RequestMapping(name = "角色管理",value = "/admin/role") @Slf4j public class AdminRoleController { @Privilege @PostMapping(name = "修改角色",value = "/post/operate") public Role operateRole(@RequestAttribute(TokenChecker.HEADER_ATTRIBUTE_USER) UserInfo loginUser, @RequestBody Role role){ } }
- 实现接口 PrivilegesListener 示例如下
/** * @description: TODO 启动时扫描需要鉴权的API * @author http://gaozhi.online * @date 2022/11/21 21:57 * @version 1.0 */ @Component @Slf4j public class PrivilegeScanService implements PrivilegesListener { private PrivilegeHandler privilegeHandler; public void setPrivilegeHandler(PrivilegeHandler privilegeHandler) { this.privilegeHandler = privilegeHandler; } @Override protected void handlePrivilege(String moduleName, String className, String methodName, String classPath, String methodPath, RequestMethod method) { //处理被Privilege注解的方法,插入数据库等... } }