之前咱们现已,出了一些列文章。 解说怎么封一致大局呼应Restful API。

感兴趣的能够看我前面几篇文章 (整个starter项目发展史)

SpringBoot界说高雅大局一致Restful API 呼应结构

SpringBoot界说高雅大局一致Restful API 呼应结构二

SpringBoot界说高雅大局一致Restful API 呼应结构三

SpringBoot界说高雅大局一致Restful API 呼应结构四

SpringBoot界说高雅大局一致Restful API 呼应结构五

SpringBoot界说高雅大局一致Restful API 呼应结构六

后续我萌生里新的想法,SpringBoot 不是供给了自己的starter。咱们也能够自界说starter吗,于是我界说了rest-api-spring-boot-starter,现已发布到maven中央仓库,对之前Restful API 呼应结构 做了集成和重构,

在这个基础上我又总结封装了我自己作业以常用的许多东西,结合SpringBoot 封装了万能的东西。 现已更新到了1.3.0 不耦合任何依靠 请运用最新版别

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

现在更新版别1.3.0 功能如下

  1. 支撑一键装备自界说RestFull API 一致格局回来
  2. 支撑RestFull API 过错国际化
  3. 支撑大局反常处理,大局参数验证处理
  4. 事务过错断语东西封装,遵循过错优先回来原则
  5. redis作业封装。支撑一切key操作东西
  6. RestTemplate 封装 POST,GET 恳求东西
  7. 日志集成。自界说日志途径,依照日志等级分类,支撑紧缩和文件巨细分割。按时刻显现
  8. 东西库集成 集成了lombok,hutool,commons-lang3,guava。不需求自己单个引进
  9. 集成mybatisPlus一键代码生成

github 地址

下面我讲一下怎么在项目中去运用

咱们新建一个SpringBoot Web项目

咱们只需求在pom中引进即可

 <dependency>
            <groupId>cn.soboys</groupId>
            <artifactId>rest-api-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>

在发动类或者装备类中加上 @EnableRestFullApi 注解即可

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

RestFull API运用

这样在项目controller中咱们写一般的恳求如:

 @PostMapping("/chat")
    public HashMap chatDialogue() {
        HashMap m = new HashMap();
        m.put("age", 26);
        m.put("name", "Judy");
        return m;
    }

回来的便是大局一致RestFull API

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

咱们也能够这么写

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

供给了许多回来办法。

当然假如你这个接口不想包装成大局回来,想自界说单独回来 如咱们只需求在办法上加上@NoRestFulApi 注解即可

   @PostMapping("/chat")
    @NoRestFulApi
    public HashMap chatDialogue() {
        HashMap m = new HashMap();
        m.put("age", 26);
        m.put("name", "Judy");
        return m;
    }

就不会对回来内容进行任何包装处理。

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

大局过错阻拦,参数校验

帮你封装好了一切http常见过错,和一切恳求类型和参数过错。

如恳求过错

{
    "success": false,
    "code": "405",
    "msg": "办法不被答应",
    "timestamp": "2023-07-03 22:36:47",
    "data": "Request method 'GET' not supported"
}

恳求资源不存在

{
    "success": false,
    "code": "404",
    "msg": "恳求资源不存在",
    "timestamp": "2023-07-03 22:42:35",
    "data": "/api"
}

参数校验过错

验证Studen目标参数

/**
 * @author 大众号 程序员三时
 * @version 1.0
 * @date 2023/6/26 22:10
 * @webSite https://github.com/coder-amiao
 */
@Data
public class Student {
    @NotBlank
    private String nam;
    @NotBlank
    private String hobby;
}
    @PostMapping("/chat")
    public HashMap chatDialogue(@Validated  Student student) {
        HashMap m = new HashMap();
        m.put("age", 26);
        m.put("name", "Judy");
        return m;
    }

恳求成果

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

JSON Body参数

    @PostMapping("/chat")
    public HashMap chatDialogue(@RequestBody @Validated  Student student) {
        HashMap m = new HashMap();
        m.put("age", 26);
        m.put("name", "Judy");
        return m;
    }

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

过错国际化

内置封装过错默许支撑英文和中文两种国际化。你不做任何装备主动支撑

假如需求内置支撑更多言语,掩盖即可。

自界说自己过错国际化和言语

  i18n:
    # 若前端无header传参则回来中文信息
    i18n-header: Lang
    default-lang: cn
    message:
      # admin
      internal_server_error:
        en: Internal Server Error
        cn: 体系过错
      not_found:
        en: Not Found
        cn: 恳求资源不存在

message 对应过错提示 对应internal_server_error 自界说 下面言语自己界说 和前端传入i18n-header 对应上,就显你界说过错言语

我不传过错国际化默许便是中文在 default-lang: cn 进行装备

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

当我传入 指定言语 就会依照你装备的国际化自界说回来过错提示

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

自界说过错呼应

假如我内置过错无法满足你事务需求,你也能够自界说自己过错码

你自界说过错枚举 只需求完成ResultCode接口即可

package cn.soboys.restapispringbootstarter;
import cn.soboys.restapispringbootstarter.i18n.I18NKey;
/**
 * @author 大众号 程序员三时
 * @version 1.0
 * @date 2023/6/26 10:21
 * @webSite https://github.com/coder-amiao
 * 呼应码接口,自界说呼应码,完成此接口
 */
public interface ResultCode extends I18NKey {
    String getCode();
    String getMessage();
}

假如要支撑国际化还需求完成国际化接口I18NKey 参考我内部HttpStatus完成即可

package cn.soboys.restapispringbootstarter;
import cn.soboys.restapispringbootstarter.i18n.I18NKey;
/**
 * @author 大众号 程序员三时
 * @version 1.0
 * @date 2023/6/26 11:01
 * @webSite https://github.com/coder-amiao
 */
public enum HttpStatus implements ResultCode, I18NKey {
    /**
     * 体系内部过错
     */
    INTERNAL_SERVER_ERROR("500", "internal_server_error"),
    BAD_GATEWAY("502", "bad_gateway"),
    NOT_FOUND("404", "not_found"),
    UNAUTHORIZED("401", "unauthorized"),
    FORBIDDEN("403", "forbidden"),
    METHOD_NOT_ALLOWED("405", "method_not_allowed"),
    REQUEST_TIMEOUT("408", "request_timeout"),
    INVALID_ARGUMENT("10000", "invalid_argument"),
    ARGUMENT_ANALYZE("10001", "argument_analyze"),
    BUSINESS_EXCEPTION("20000", "business_exception");
    private final String value;
    private final String message;
    HttpStatus(String value, String message) {
        this.value = value;
        this.message = message;
    }
    @Override
    public String getCode() {
        return value;
    }
    @Override
    public String getMessage() {
        return message;
    }
    @Override
    public String key() {
        return message;
    }
}
rest-api:
  enabled: false
  i18n:
    # 若前端无header传参则回来中文信息
    i18n-header: Lang
    default-lang: cn
    message:
      # admin
      internal_server_error:
        en: Internal Server Error
        cn: 体系过错
      bad_gateway:
        en: Bad Gateway
        cn: 过错的恳求
      unauthorized:
        en: Unauthorized
        cn: 未授权
      forbidden:
        en: Forbidden
        cn: 资源制止访问
      method_not_allowed:
        en: Method Not Allowed
        cn: 办法不被答应
      request_timeout:
        en: Request Timeout
        cn: 恳求超时
      invalid_argument:
        en: Invalid Argument {}
        cn: 参数过错 {}
      argument_analyze:
        en: Argument Analyze {}
        cn: 参数解析反常 {}
      business_exception:
        en: Business Exception
        cn: 事务过错
      not_found:
        en: Not Found
        cn: 恳求资源不存在

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

内部过错不需求做任何装备,主动支撑国际化。假如需求支撑更多言语,能够自界说进行掩盖。

事务反常断语

在项目开发中咱们有时需求封装自己反常类,信息我封装了一致的过错反常类。 BusinessException 对事务反常类做了大局过错阻拦,

封装了一致事务反常断语东西,遵循过错优先回来原则。代码更高雅

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

    @GetMapping("/exception")
    public Result exception(){
        Student s=null;
        Assert.isFalse(s==null,"学生不能为空");
        return Result.buildSuccess();
    }

抛出一致事务反常

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

当然假如你要界说自己的反常类。能够界说自己反常类承继我的BusinessException

Redis 东西库运用

进一步封装的对Redis所以相关key,value操作,在运用redis东西库时分。咱们需求引进

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

默许不会帮你引进。

然后在运用时分注入就行

@Autowired
    private RedisTempUtil redisTempUtil;

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

    @GetMapping("/redis")
    public Result redis() {
        redisTempUtil.set("test", "123456");
        return Result.buildSuccess();
    }
    @GetMapping("/redis/get")
    public Result redisGet() {
        String value = redisTempUtil.get("test").toString();
        log.info("redis值{}", value);
        return Result.buildSuccess();
    }

RestTemplate 恳求东西

进一步封装了RestTemplate恳求 Post和GET 项目中运用时注入

 @Autowired
    private RestFulTemp restFulTemp;

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

    @GetMapping("/doGet")
    public Result doGet() {
        ResponseEntity<String> response = restFulTemp.doGet("http://127.0.0.1:8000/redis/get");
        return Result.buildSuccess(response.getBody());
    }

日志运用

进一步封装了 日志处理到达开箱即用。在特点文件中装备相关日志装备即可

rest-api:
  enabled: false
  logging:
    path: ./logs   #日志存储途径(服务器上绝对)
    max-history: 90 # 保存多少天
    max-file-size: 3MB  # 每个文件巨细
    max-total-size-cap: 1GB  #总文件巨细超过多少紧缩
    level-root: INFO    # 这儿的INFO能够替换为其他日志等级,如DEBUG, WARN, ERROR, TRACE, FATAL, OFF等。 日志等级由低到高分别是debugger-info-warn-error

假如你的特点文件不做任何日志装备,默许日志便是上面这样装备。

集成mybatisPlus一键代码生成

在项目中咱们会频频运用到mybatisPlus 但是简略的模板代码咱们一键生成就好。 默许不依靠mybatisPlus任何相关包。假如需求运用主动代码生成引进mybatisPlus 代码生成依靠包即可。

 <!--生成器依靠-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
            <optional>true</optional>
        </dependency>
        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
            <optional>true</optional>
        </dependency>
        <!--代码生成依靠的模板引擎-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
            <optional>true</optional>
        </dependency>

你能够直接写测验类,然后直接去调用代码生成即可

public class Test {
    public static void main(String[] args) {
        GenerateCodeConfig config=new GenerateCodeConfig();
        config.setDriverName("com.mysql.cj.jdbc.Driver");
        config.setUsername("root");
        config.setPassword("root");
        config.setUrl("jdbc:mysql://127.0.0.1:3306/ry?useUnicode=true&useSSL=false&characterEncoding=utf8");
        //生成代码保存途径,不设置便是当时项目下途径,怎么设置请运用绝对途径
        config.setProjectPath("superaide");
        config.setPackages("cn.soboys.superaide");
        MyBatisPlusGenerator.generate(config);
    }
}

作用如下

SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件

关注大众号,程序员三时 继续输出优质内容 期望给你带来一点启发和协助

下篇文章就这个源码分析解说 怎么封装自己的stater

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。