java 17+ cloud 2023.0.0 boot 3.2.0 cloud alibaba 2022.0.0.0-Rc2 maven 3.9+ mysql 8.0+
一、创建项目
-
new project
-
聚合总父工程名字
-
字符编码
4.注解生效激活
5.java编译版本选17
6.file type 过滤
删除src
1.1maven中的dependencyManager
与dependencies
一般在项目最顶层pom
中看到dependencyManager
能让所有在子项目中引用一个依赖而不显示的列出版本号,maven会沿着父子层次向上走,知道找到一个拥有dependencyManagement
元素的项目,然后就会使用这个dependencyManagement
元素中指定的版本号
好处:如果有多个子项目都引用一样依赖,则可以避免在每个使用的子项目里面都声明一个版本号
-
当想升级或切换另一个版本的时候,只需要在顶层父容器更新,而不需要一个一个修改子项目
-
如果某个子项目需要另外一个版本,只需要声明version就可。
1.2跳过单元测试配置
1.3创建子项目
步骤
-
建module
-
改pom
-
写yml
-
主启动
-
写业务
1.4Swagger3
-
1.加注解
注解 | 标注位置 | 作用 |
---|---|---|
@Tag | controller类 | 标识controller作用 |
@Parameter | 参数 | 标识参数作用 |
@Parameters | 参数 | 参数多重说明 |
@Schema | modle层的javaBean | 描述魔性作用及每个属性 |
@Operation | 方法 | 描述方法作用 |
@ApiRestponse | 方法 | 描述响应状态码等 |
2.含分组迭代的Config配置类
package com.atguigu.cloud.config;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Swagger3Config
{
@Bean
public GroupedOpenApi PayApi()
{
return GroupedOpenApi.builder().group("支付微服务模块").pathsToMatch("/pay/**").build();
}
@Bean
public GroupedOpenApi OtherApi()
{
return GroupedOpenApi.builder().group("其它微服务模块").pathsToMatch("/other/**", "/others").build();
}
/*@Bean
public GroupedOpenApi CustomerApi()
{
return GroupedOpenApi.builder().group("客户微服务模块").pathsToMatch("/customer/**", "/customers").build();
}*/
@Bean
public OpenAPI docsOpenApi()
{
return new OpenAPI()
.info(new Info().title("cloud2024")
.description("通用设计rest")
.version("v1.0"))
.externalDocs(new ExternalDocumentation()
.description("www.hhf.com")
.url("https://yiyan.baidu.com/"));
}
}
3.调试方式
http://localhost:8001/swagger-ui/index.html
1.5优化
1.完善日期时间格式
可以在相应类的属性上面使用@JsonFormat注解
@Column(name = "create_time")
@Schema(title = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
@Column(name = "update_time")
@Schema(title = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date updateTime;
如果是Spring Boot项目,也可以在application.yml文件中指定
spring:
jackson:
date-format:yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
2.统一返回值
思路:定义返回标准格式,3大标配
code状态值:由后端统一定义各种返回结果的状态码
message描述:本次接口调用的结果描述
data数据:本次返回的数据
扩展:接口调用时间之类,timestamp:接口调用时间
步骤:
1.新建枚举类ResturnCodeEnmu
HTTP请求返回状态码
ReturnCodeEnum
package com.atguigu.cloud.resp;
import lombok.Getter;
import java.util.Arrays;
@Getter
public enum ReturnCodeEnum {
RC999("999","操作xxx失败"),
RC200("200", "success"),
RC201("201", "服务器开启降级保护,请稍后再试"),
RC202("202", "热点参数限流,请稍后再试"),
RC203("203", "系统规则不满足要求,请稍后再试"),
RC204("204", "授权规则不通过,请稍后再试"),
RC403("403", "无访问权限,请联系管理员授予权限"),
RC401("401", "匿名用户访问无权限资源时的异常"),
RC404("404", "404页面找不到的异常"),
RC500("500", "系统异常请稍后再试"),
RC375("375", "数学运算异常,请稍后再试"),
INVALID_YOKEN("2001","访问令牌不合法"),
ACCESS_DENIED("2003","没有权限访问该资源"),
CLIENT_AUTHENTICATION_FAILED("1001","客户端认证失败"),
USERNAME_OR_PASSWORD_ERROE("1002","用户名或密码错误"),
BUSINESS_ERROR("1004","业务逻辑异常"),
UNSUPPORTED_GRANT_TYPE("1003","不支持的认证模式");
private final String code;
private final String message;
ReturnCodeEnum(String code, String message) {
this.code = code;
this.message = message;
}
/**
* 如何定义一个通用的枚举类
* 举值-构造-遍历
*/
//传统版
//3.1
public static ReturnCodeEnum getReturnCodeEnum(String code){
for (ReturnCodeEnum element : ReturnCodeEnum.values()) {
if(element.getCode().equalsIgnoreCase(code)){
return element;
}
}
return null;
}
//3.2Stream流式计算
public static ReturnCodeEnum getReturnEnum1(String code){
return Arrays.stream(ReturnCodeEnum.values()).filter(x -> x.getCode().equalsIgnoreCase(code)).findFirst().orElse(null);
}
}
2.新建统一定义返回对象ResultData
1.6全局异常处理
为什么需要全局异常处理器,不在手写try...catch
新建全局异常类GlobalExecptionHandler
package com.atguigu.cloud.exp;
import com.atguigu.cloud.resp.ResultData;
import com.atguigu.cloud.resp.ReturnCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class GlobalExexptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResultData<String> execption(Exception e){
System.out.println("####come in GlobalExecptionHandler");
log.error("全局异常信息:{}",e.getMessage(),e);
return ResultData.fail(ReturnCodeEnum.RC500.getCode(), e.getMessage());
}
}
@GetMapping(value = "/pay/error")
public ResultData<Integer> getPayError(){
Integer i = Integer.valueOf(200);
try{
System.out.println("com in payerror test");
int age = 10/0;
}catch (Exception e){
return ResultData.fail(ReturnCodeEnum.RC500.getCode(), e.getMessage());
}
return ResultData.success(i);
}