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

4次阅读

共计 7298 个字符,预计需要花费 19 分钟才能阅读完成。

之前咱们曾经,出了一些列文章。解说如何封对立全局响应 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 不耦合任何依赖 请应用最新版本

目前更新版本 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 注解即可

RestFull API 应用

这样在我的项目 controller 中咱们写一般的申请如:

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

返回的就是全局对立 RestFull API

咱们也能够这么写

提供了很多返回办法。

当然如果你这个接口不想包装成全局返回,想自定义独自返回 如咱们只须要在办法上加上@NoRestFulApi 注解即可

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

就不会对返回内容进行任何包装解决。

全局谬误拦挡,参数校验

帮你封装好了所有 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;
    }

申请后果

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;
    }

谬误国际化

内置封装谬误默认反对英文和中文两种国际化。你不做任何配置主动反对

如果须要内置反对更多语言,笼罩即可。

自定义本人谬误国际化和语言

  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
进行配置

当我传入 指定语言 就会依照你配置的国际化自定义返回谬误提醒

自定义谬误响应

如果我内置谬误无奈满足你业务需要,你也能够自定义本人错误码

你自定义谬误枚举 只须要实现 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: 申请资源不存在

![](https://images.soboys.cn/202307040127708.png)

![](https://images.soboys.cn/202307040127574.png)

![](https://images.soboys.cn/202307042336110.png)

![](https://images.soboys.cn/202307042337644.png)

外部谬误不须要做任何配置,主动反对国际化。如果须要反对更多语言,能够自定义进行笼罩。# 业务异样断言

在我的项目开发中咱们有时须要封装本人异样类,信息我封装了对立的谬误异样类。**BusinessException** 对业务异样类做了全局谬误拦挡,封装·了对立业务异样断言工具,遵循谬误优先返回准则。代码更优雅

![](https://images.soboys.cn/202307040915661.png)
@GetMapping("/exception")
public Result exception(){
    Student s=null;
    Assert.isFalse(s==null,"学生不能为空");
    return Result.buildSuccess();}
抛出对立业务异样


![](https://images.soboys.cn/202307040920873.png)

当然如果你要定义本人的异样类。能够定义本人异样类·继承我的 **BusinessException**


# Redis 工具库应用
进一步封装的对 **Redis** 所以相干 key,value 操作,在应用 redis 工具库时候。咱们须要引入

<dependency>

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

默认不会帮你引入。而后在应用时候注入就行
````
@Autowired
    private RedisTempUtil redisTempUtil;
````

![](https://images.soboys.cn/202307040939790.png)
@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;

![](https://images.soboys.cn/202307040957101.png)
@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);
}

}


成果如下
![](https://images.soboys.cn/202307050049316.png)


关注公众号,** 程序员三时 ** 继续输入优质内容 心愿给你带来一点启发和帮忙

下篇文章就这个源码分析解说 如何封装本人的 **stater**













正文完
 0