之前咱们曾经,出了一些列文章。 解说如何封对立全局响应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 */@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: 申请资源不存在
外部谬误不须要做任何配置,主动反对国际化。如果须要反对更多语言,能够自定义进行笼罩。# 业务异样断言在我的项目开发中咱们有时须要封装本人异样类,信息我封装了对立的谬误异样类。**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**