之前咱们现已,出了一些列文章。 解说怎么封一致大局呼应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 功能如下
- 支撑一键装备自界说RestFull API 一致格局回来
- 支撑RestFull API 过错国际化
- 支撑大局反常处理,大局参数验证处理
- 事务过错断语东西封装,遵循过错优先回来原则
- redis作业封装。支撑一切key操作东西
- RestTemplate 封装 POST,GET 恳求东西
- 日志集成。自界说日志途径,依照日志等级分类,支撑紧缩和文件巨细分割。按时刻显现
- 东西库集成 集成了lombok,hutool,commons-lang3,guava。不需求自己单个引进
- 集成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: 恳求资源不存在




内部过错不需求做任何装备,主动支撑国际化。假如需求支撑更多言语,能够自界说进行掩盖。
事务反常断语
在项目开发中咱们有时需求封装自己反常类,信息我封装了一致的过错反常类。 BusinessException 对事务反常类做了大局过错阻拦,
封装了一致事务反常断语东西,遵循过错优先回来原则。代码更高雅

@GetMapping("/exception")
public Result exception(){
Student s=null;
Assert.isFalse(s==null,"学生不能为空");
return Result.buildSuccess();
}
抛出一致事务反常

当然假如你要界说自己的反常类。能够界说自己反常类承继我的BusinessException
Redis 东西库运用
进一步封装的对Redis所以相关key,value操作,在运用redis东西库时分。咱们需求引进
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
默许不会帮你引进。
然后在运用时分注入就行
@Autowired
private RedisTempUtil redisTempUtil;

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

@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);
}
}
作用如下

关注大众号,程序员三时 继续输出优质内容 期望给你带来一点启发和协助
下篇文章就这个源码分析解说 怎么封装自己的stater