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

返回:springBoot

Swagger在线接口文档

返回顶部

::: tip 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());  
}

::: tip 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;  
    }
}

全局异常拦截

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

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

// 指定作用类
@RestControllerAdvice(basePackageClasses = {com.xtoad.study.baseinfo.controller.HelloController.class})
// 指定作用包
@RestControllerAdvice(basePackages = {com.xtoad.study.baseinfo.controller})

当一个工程中有多个增强类时,你可以通过@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 {
    // 内部代码忽略
}

多环境配置文件

返回顶部

SpringBoot多环境配置

对于一个项目来讲基本都4有个环境dev,test,pre,prod,对于SpringBoot项目多建立几个配置文件就可以了。

java -jar BasicProject.jar --spring.profiles.active=prod

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>

更改application.yml

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

JenkinsFile