# 一个springboot项目应该包含哪些内容
# Swagger在线接口文档
swagger
写接口文档通常是一件比较头疼的事情,然而swagger就用是用来帮我们解决这个问题的
WARNING
注意的点:接口文档只能在测试/开发环境开启,其他环境请关闭
# 常用的Swagger注解
- @Api用于Controller
- @ApiOperation用于Controller内的方法。
- @ApiResponses用于标识接口返回数据的类型。
- @ApiModel用于标识类的名称
- @ApiModelProperty用于标识属性的名称
# CodeGenerator代码生成器
# 常用的封装
# 统一返回 ResultVo
# 抽象表单 BaseForm
public abstract class BaseForm<T> {
/**
* 获取实例
* @return 返回实体类
*/
public abstract T buildEntity();
}
@Data
@EqualsAndHashCode(callSuper = false)
public class AddUserForm extends BaseForm<User> {
/**
* 昵称
*/
private String nickname;
/**
* 生日
*/
private Date birthday;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 构造实体
* @return 实体对象
*/
@Override
public User buildEntity() {
User user = new User();
BeanUtils.copyProperties(this,user);
return user;
}
}
/**
* 添加用户
* @param userForm 表单数据
* @return true 或者 false
*/
@Override
public boolean addUser(AddUserForm userForm) {
return save(userForm.buildEntity());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
BaseForm
所以对于这类的form可以继承baseform并实现buildEntity()这样可以更加符合面向对象,service不需要关心form如何转变成entity,只需要在使用的时候调用buildEntity()即可,尤其是在form -> entity相对复杂的时候,这样做可以减少service内的代码。让代码逻辑看起来更加清晰。
# 通用的分页对象
# 常用工具类
TIP
HuTool了解下
# 异常处理
- 异常信息抛出 -> ControllerAdvice 进行捕获格式化输出内容
- 手动抛出CustomException并传入ReulstEnum ——> 进行捕获错误信息输出错误信息。
# 自定义异常
@Data
@EqualsAndHashCode(callSuper = false)
public class CustomException extends RuntimeException {
/**
* 状态码
*/
private final Integer code;
/**
* 方法名称
*/
private final String method;
/**
* 自定义异常
*
* @param resultEnum 返回枚举对象
* @param method 方法
*/
public CustomException(ResultEnum resultEnum, String method) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
this.method = method;
}
/**
* @param code 状态码
* @param message 错误信息
* @param method 方法
*/
public CustomException(Integer code, String message, String method) {
super(message);
this.code = code;
this.method = method;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 全局异常拦截
全局异常拦截是使用@ControllerAdvice进行实现,常用的异常拦截配置可以查看 GlobalExceptionHandling。
# @ControllerAdvice和@RestControllerAdvice 直译就是控制器增强
# Spring的事务默认只有RuntimeException才会回滚,要时刻注意这一点
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandling {
/**
* 自定义异常
*/
@ExceptionHandler(value = CustomException.class)
public ResultVo processException(CustomException e) {
log.error("位置:{} -> 错误信息:{}", e.getMethod() ,e.getLocalizedMessage());
return ResultVoUtil.error(Objects.requireNonNull(ResultEnum.getByCode(e.getCode())));
}
/**
* 通用异常
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
public ResultVo exception(Exception e) {
e.printStackTrace();
return ResultVoUtil.error(ResultEnum.UNKNOWN_EXCEPTION);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestControllerAdvice注解,是可以通过参数对指定类增强的,可以指定具体类,或者指定包:
// 指定作用类
@RestControllerAdvice(basePackageClasses = {com.xtoad.study.baseinfo.controller.HelloController.class})
// 指定作用包
@RestControllerAdvice(basePackages = {com.xtoad.study.baseinfo.controller})
1
2
3
4
2
3
4
当一个工程中有多个增强类时,你可以通过@Order(Ordered.HIGHEST_PRECEDENCE) 注解来指定优先执行你的局部增强类。
/**
* 全局异常捕捉处理
*
* @author xtoad
* @date 2020/02/15
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
// 内部代码忽略
}
/**
* HelloController异常捕捉处理
*
* @author xtoad
* @date 2020/02/15
*/
@RestControllerAdvice(basePackageClasses = {com.xtoad.study.baseinfo.controller.HelloController.class})
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HelloControllerExceptionHandler {
// 内部代码忽略
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 多环境配置文件
# SpringBoot多环境配置
对于一个项目来讲基本都4有个环境dev,test,pre,prod,对于SpringBoot项目多建立几个配置文件就可以了。
java -jar BasicProject.jar --spring.profiles.active=prod
1
# Maven多环境配置
假如想在打包的时候动态指定环境,这个时候就需要借助Maven的xml来实现
<!-- 配置环境 -->
<profiles>
<profile>
<!-- 开发 -->
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
</profile>
<profile>
<!-- 测试 -->
<id>test</id>
<properties>
<activatedProperties>test</activatedProperties>
</properties>
</profile>
<profile>
<!-- 准生产 -->
<id>pre</id>
<properties>
<activatedProperties>pre</activatedProperties>
</properties>
</profile>
<profile>
<!-- 生产 -->
<id>prod</id>
<properties>
<activatedProperties>prod</activatedProperties>
</properties>
</profile>
</profiles>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 更改application.yml
spring:
profiles:
# 选择环境
active: @activatedProperties@
1
2
3
4
2
3
4
mvn clean package -P prod
mvn clean package -P pre
mvn clean package -P test
1
2
3
2
3