SpringBoot统一返回结果,统一异常处理,统一header参数校验等通用操作

spring-base

Gitee地址


对springBoot项目的一些通用操作进行的封装,包括如下几个部分:

  • 统一的异常捕获
  • 统一的JSON返回格式
  • 统一的权限接口扫描:@Privilege 被注解的请求会在项目启动时被扫描处理,此注解需要配合@RequestMapping使用
  • 这个基础模块在构建SpringBoot项目时给我带来了很大的方便,添加依赖就可以轻松构建标准的SpringBoot项目

使用方法

  1. 首先下载源代码使用maven安装到本地仓库,可修改springBoot(2.3.10.RELEASE)以及springCloud(Hoxton.SR11)版本。

  2. 在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>
    

简单应用到项目

  1. 统一结果格式:在新项目的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}"
    }
    
  2. 统一异常处理:在接口逻辑任意地方抛出的运行时异常都将被捕获并封装为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,"其余附加信息");
       }
    
  3. 权限列表的扫描,会在项目启动时扫描一次被@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注解的方法,插入数据库等...
         } 
     }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

54号考生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值