# 一个springboot项目应该包含哪些内容

返回: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

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

# 全局异常拦截

全局异常拦截是使用@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

@RestControllerAdvice注解,是可以通过参数对指定类增强的,可以指定具体类,或者指定包:

// 指定作用类
@RestControllerAdvice(basePackageClasses = {com.xtoad.study.baseinfo.controller.HelloController.class})
// 指定作用包
@RestControllerAdvice(basePackages = {com.xtoad.study.baseinfo.controller})
1
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

# 多环境配置文件

返回顶部

# 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

# 更改application.yml

spring:  
  profiles:  
    # 选择环境  
    active: @activatedProperties@
1
2
3
4
mvn clean package -P prod  
mvn clean package -P pre  
mvn clean package -P test
1
2
3

# JenkinsFile