之前咱们曾经,出了一些列文章。 解说如何封对立全局响应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 */@Datapublic 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;}@Overridepublic String getCode() {    return value;}@Overridepublic String getMessage() {    return message;}@Overridepublic String key() {    return message;}

}

rest-api:
enabled: false
i18n:

# 若前端无header传参则返回中文信息i18n-header: Langdefault-lang: cnmessage:  # 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**