SpringBoot项目搭建与配置 -- 知识铺
p1 创建springBoot项目
打开Idea ,选择新建项目
如果服务器的url不是国内的,可以先修改成阿里的 地址是 start.aliyun.com
修改后创建项目的速度会快很多
然后按照如下图所示创建项目
点击下一步后,会出现让你选择maven依赖选项
选好以后点击创建 就可以了。
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?><br><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><br> <modelVersion>4.0.0</modelVersion><br> <parent><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-parent</artifactId><br> <version>2.5.9</version><br> <relativePath/> <!-- lookup parent from repository --><br> </parent><br> <groupId>com.wg</groupId><br> <artifactId>wg-springBoot</artifactId><br> <version>0.0.1-SNAPSHOT</version><br> <name>springboot</name><br> <description>wg-springBoot</description><br> <properties><br> <java.version>1.8</java.version><br> </properties><br> <dependencies><br> <dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-web</artifactId><br> </dependency><br><br> <!-- mybatis --><br> <dependency><br> <groupId>org.mybatis.spring.boot</groupId><br> <artifactId>mybatis-spring-boot-starter</artifactId><br> <version>2.1.0</version><br> </dependency><br><br> <!-- 分页器 --><br> <dependency><br> <groupId>com.github.pagehelper</groupId><br> <artifactId>pagehelper-spring-boot-starter</artifactId><br> <version>1.2.5</version><br> </dependency><br><br> <!-- mysql数据库驱动 --><br> <dependency><br> <groupId>mysql</groupId><br> <artifactId>mysql-connector-java</artifactId><br> <scope>runtime</scope><br> </dependency><br><br> <!-- lombok --><br> <dependency><br> <groupId>org.projectlombok</groupId><br> <artifactId>lombok</artifactId><br> <optional>true</optional><br> </dependency><br><br> <dependency><br> <groupId>org.apache.velocity</groupId><br> <artifactId>velocity-engine-core</artifactId><br> <version>2.3</version><br> </dependency><br><br><br> <!-- hutool --><br> <dependency><br> <groupId>cn.hutool</groupId><br> <artifactId>hutool-all</artifactId><br> <version>5.7.20</version><br> </dependency><br><br> <!-- 工具类 --><br> <dependency><br> <groupId>org.apache.poi</groupId><br> <artifactId>poi-ooxml</artifactId><br> <version>4.1.2</version><br> </dependency><br><br> <!-- saToken 依赖 --><br> <dependency><br> <groupId>cn.dev33</groupId><br> <artifactId>sa-token-spring-boot-starter</artifactId><br> <version>1.37.0</version><br> </dependency><br><br> <!-- 邮箱 javaMail --><br> <dependency><br> <groupId>com.sun.mail</groupId><br> <artifactId>javax.mail</artifactId><br> <version>1.6.2</version><br> </dependency><br><br> <!--参数校验Valid--><br> <dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-validation</artifactId><br> </dependency><br><br> <!-- swagger2 --><br> <dependency><br> <groupId>io.springfox</groupId><br> <artifactId>springfox-swagger2</artifactId><br> <version>2.8.0</version><br> </dependency><br> <dependency><br> <groupId>io.springfox</groupId><br> <artifactId>springfox-swagger-ui</artifactId><br> <version>2.8.0</version><br> </dependency><br> <!-- 引入swagger-bootstrap-ui包 --><br> <dependency><br> <groupId>com.github.xiaoymin</groupId><br> <artifactId>swagger-bootstrap-ui</artifactId><br> <version>1.8.5</version><br> </dependency><br><br> <!-- IP解析 --><br> <dependency><br> <groupId>org.lionsoul</groupId><br> <artifactId>ip2region</artifactId><br> <version>2.6.5</version><br> </dependency><br> </dependencies><br><br> <build><br> <plugins><br> <plugin><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-maven-plugin</artifactId><br> <configuration><br> <excludes><br> <exclude><br> <groupId>org.projectlombok</groupId><br> <artifactId>lombok</artifactId><br> </exclude><br> </excludes><br> </configuration><br> </plugin><br> </plugins><br> </build><br></project>
p2 配置maven国内阿里镜像
有时候在国内使用maven国外镜像下载jar包会很慢 , 所以一般会配置国内阿里云的maven仓库来进行加速
首先咱们打开设置项
在设置弹框内搜索 maven ,在构建工具内找到 maven 选项
一般idea会内置一个maven 在没有硬性要求下 可以直接使用这个
在电脑文件夹上面找到这俩个项目文件路径
在settings.xml上面修改如下选项
把这个mirrors 改成阿里的
<mirrors><br> <mirror><br> <id>nexus-aliyun</id><br> <mirrorOf>central</mirrorOf><br> <name>Nexus aliyun</name><br> <url>http://maven.aliyun.com/nexus/content/groups/public</url><br> </mirror><br> </mirrors>
然后找到依赖仓库的存放文件夹
把这里改成自己对应仓库的文件夹目录即可
修改好后保存退出
然后回到项目 打开maven
在执行第二步的时候 看到如下图所示则代表配置成功
p3 配置mybatis,mysql 重试 错误原因
mybatis 对应的maven依赖如下
<dependency><br> <groupId>org.mybatis.spring.boot</groupId><br> <artifactId>mybatis-spring-boot-starter</artifactId><br> <version>2.1.0</version><br> </dependency>
引入依赖后,在pom.xml文件右上角会出现一个导入的按钮,点击即可
application.yml 内配置mybatis 重试 错误原因
# mybatis的配置<br>mybatis:<br> #扫描所有mybatis的xml文件,这里的路径 classpath: 指的是在 项目的resources 目录下<br> mapper-locations: classpath:mapper/*.xml
注意,配置了该依赖,则需要在application.yml内配置数据库连接地址:
引入数据库驱动,maven依赖如下
<!-- mysql数据库驱动 --><br><dependency><br> <groupId>mysql</groupId><br> <artifactId>mysql-connector-java</artifactId><br></dependency>
application.yml 内配置mysql数据库连接:
spring:<br> datasource:<br> # 数据库驱动,必须要引入 mysql数据库驱动 才能找得到这个包<br> driver-class-name: com.mysql.cj.jdbc.Driver<br> # 数据库的连接地址 serverTimezone 是时区的意思 %2b 是 "+" 号的意思 GMT%2b8 代表时区为东八区<br> url: jdbc:mysql://localhost:3306/wg-springBoot?serverTimezone=GMT%2b8<br> username: root<br> password: tw19960705
配置完成后,可以运行一下项目
p4 logback-xml日志控制
在resources目录下增加logback.xml文件
logback.xml 内容如下:
<?xml version="1.0" encoding="UTF-8"?><br><configuration scan="true" scanPeriod="60 seconds" debug="false"><br> <contextName>logback</contextName><br> <!--输出到控制台--><br> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"><br> <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><br> <level>ERROR</level><br> </filter>--><br> <encoder><br> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern><br> </encoder><br> </appender><br><br> <!--按天生成日志--><br> <appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><br> <Prudent>true</Prudent><br> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><br> <FileNamePattern><br> logs/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log<br> </FileNamePattern><br> </rollingPolicy><br> <layout class="ch.qos.logback.classic.PatternLayout"><br> <Pattern><br> %d{yyyy-MM-dd HH:mm:ss} -%msg%n<br> </Pattern><br> </layout><br> </appender><br><br> <root level="debug,ERROR"><br> <appender-ref ref="console" /><br> <appender-ref ref="logFile" /><br> </root><br><br> <!-- <logger name="com.pos" level="INFO" additivity="false"><br> <appender-ref ref="console"/><br> </logger> --><br></configuration>
application.yml 配置: 重试 错误原因
# log日志配置<br>logging:<br> level:<br> org.springframework.boot.autoconfigure: INFO<br> # 对应项目的包路径<br> com.wg.dao: DEBUG
配置好后启动项目就可以了…
p5 基于 Sa-token 的登陆认证
在pom.xml文件中引入依赖
<!-- saToken 依赖 --><br><dependency><br> <groupId>cn.dev33</groupId><br> <artifactId>sa-token-spring-boot-starter</artifactId><br> <version>1.37.0</version><br></dependency>
在application.yml内的配置如下:
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############<br>sa-token:<br> # token 名称(同时也是 cookie 名称)<br> token-name: token<br> # token 有效期(单位:秒) 默认30天,-1 代表永久有效<br> timeout: 2592000<br> # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结<br> active-timeout: -1<br> # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)<br> is-concurrent: true<br> # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)<br> is-share: true<br> # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)<br> token-style: random-128<br> # 是否输出操作日志 (建议关闭)<br> is-log: false
新建一个配置类 SaTokenConfigure , 内容如下:
package com.wg.config;<br><br>import cn.dev33.satoken.exception.NotLoginException;<br>import cn.dev33.satoken.interceptor.SaInterceptor;<br>import cn.dev33.satoken.stp.StpUtil;<br>import com.wg.common.Constants;<br>import com.wg.exp.ServiceException;<br>import org.springframework.beans.factory.annotation.Value;<br>import org.springframework.context.annotation.Configuration;<br>import org.springframework.web.servlet.HandlerExceptionResolver;<br>import org.springframework.web.servlet.config.annotation.InterceptorRegistry;<br>import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;<br>import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;<br><br>import java.io.NotActiveException;<br><br>/**<br> * [Sa-Token 权限认证] 配置类<br> */<br>@Configuration<br>public class SaTokenConfigure implements WebMvcConfigurer {<br><br> // 注册Sa-Token的注解拦截器,打开注解式鉴权功能<br> @Override<br> public void addInterceptors(InterceptorRegistry registry) {<br> // 注册 Sa-Token 拦截器,校验规则为 StpUtil.checkLogin() 登录校验。<br> registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))<br> // 所有接口都需要鉴权<br> .addPathPatterns("/**")<br> // 放行登陆接口 (后续接口需要放行,在这里配置就行)<br> .excludePathPatterns("/admin/login","/admin/register","/admin/sendEmailCode","/file/upload","/admin/updatePassword")<br> // 放行静态资源<br> .excludePathPatterns("/file/**","/favicon.ico","/swagger**/**","/webjars/**","/precache-manifest.**.js", "/v3/**","/service-worker.js","/doc.html");<br> }<br>}
配置该类的目的是为了每次接口请求之前,先判断一下该用户是否已经登陆, StpUtil.checkLogin() 方法就能够做 到
然后配置一下放行的接口,以及需要放行的静态文件
配置好后在启动类上添加这句话:
每次启动如果打印了这句话, 代表配置没有问题;
p6 自定义异常
在如下位置添加类 ServiceException
package com.wg.exp;<br><br>import lombok.Getter;<br><br>/**<br> * 自定义异常<br> */<br>@Getter<br>public class ServiceException extends RuntimeException {<br> private String code;<br><br> public ServiceException(String code, String msg) {<br> super(msg);<br> this.code = code;<br> }<br>}<br>
继承 RuntimeException 运行时异常
p7 全局异常捕捉
在如下位置新建 GlobalExceptionHandler
GlobalExceptionHandler 内容如下: 重试 错误原因
package com.wg.exp;<br>import cn.dev33.satoken.exception.NotLoginException;<br>import cn.hutool.log.Log;<br>import com.wg.common.Constants;<br>import com.wg.common.Result;<br>import org.springframework.validation.BindingResult;<br>import org.springframework.web.bind.MethodArgumentNotValidException;<br>import org.springframework.web.bind.annotation.ExceptionHandler;<br>import org.springframework.web.bind.annotation.RestControllerAdvice;<br>import org.springframework.web.util.NestedServletException;<br><br>@RestControllerAdvice<br>public class GlobalExceptionHandler {<br> private static final Log log = Log.get();<br> /**<br> * token获取错误<br> * @param e token错误<br> * @return Result<br> */<br> @ExceptionHandler(NotLoginException.class)<br> public Result<?> notLoginHandler(NotLoginException e) {<br> log.error("Sa-token登陆异常:{}",e.getMessage());<br> return Result.error(Constants.CODE_401,e.getMessage());<br> }<br><br> @ExceptionHandler(ServiceException.class)<br> public Result<?> serviceException(ServiceException e) {<br> log.error("自定义异常:{}",e.getMessage());<br> return Result.error(Constants.CODE_600,e.getMessage());<br> }<br><br>}<br>
因为之前已经配置了 saToken 的登陆验证,如果 StpUtil.checkLogin() 如果登陆未通过,会抛出 NotLoginException 异常,所以在这里也需要捕捉一下这个异常 统一返回给前端
p8 生成swagger接口文档
maven依赖如下:
<!-- swagger2 --><br><dependency><br> <groupId>io.springfox</groupId><br> <artifactId>springfox-swagger2</artifactId><br> <version>2.8.0</version><br></dependency><br><dependency><br> <groupId>io.springfox</groupId><br> <artifactId>springfox-swagger-ui</artifactId><br> <version>2.8.0</version><br></dependency><br><!-- 引入swagger-bootstrap-ui包 --><br><dependency><br> <groupId>com.github.xiaoymin</groupId><br> <artifactId>swagger-bootstrap-ui</artifactId><br> <version>1.8.5</version><br></dependency>
引入依赖后在如下位置新建一个 SwaggerConfig
package com.wg.config;<br><br>import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;<br>import io.swagger.annotations.Api;<br>import io.swagger.annotations.ApiOperation;<br>import org.springframework.context.annotation.Bean;<br>import org.springframework.context.annotation.Configuration;<br>import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;<br>import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;<br>import springfox.documentation.builders.ApiInfoBuilder;<br>import springfox.documentation.builders.PathSelectors;<br>import springfox.documentation.builders.RequestHandlerSelectors;<br>import springfox.documentation.service.ApiInfo;<br>import springfox.documentation.service.Contact;<br>import springfox.documentation.spi.DocumentationType;<br>import springfox.documentation.spring.web.plugins.Docket;<br>import springfox.documentation.swagger2.annotations.EnableSwagger2;<br><br>@EnableSwagger2<br>@Configuration<br>public class SwaggerConfig {<br> @Bean<br> public Docket createRestApi() {<br> //http://ip地址:端口/项目名/swagger-ui.html#/<br> ApiInfo apiInfo = new ApiInfoBuilder()<br> .title("wg-springBoot") //网站标题<br> .description("WG RESTFUL API......") //网站描述<br> .version("1.0") //版本<br> .contact(new Contact("WG","","2805487767@qq.com")) //联系人<br> .license("The Apache License") //协议<br> .licenseUrl("http://www.baidu.com") //协议url<br> .build();<br> return new Docket(DocumentationType.SWAGGER_2) //swagger版本<br> .pathMapping("/")<br> .select()<br> //扫描那些controller<br> .apis(RequestHandlerSelectors.basePackage("com.wg.controller"))<br> .paths(PathSelectors.any())<br> .build()<br> .apiInfo(apiInfo);<br> }<br>}<br>
p9 JSR303参数校验
引入依赖
<!--参数校验Valid--><br> <dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-validation</artifactId><br> </dependency>
当参数校验不通过后会抛出异常, 所以我们需要在 全局异常捕捉一下 并且统一返回给前端
找到这个类,把如下代码放进去
/**<br> * 参数校验全局异常捕捉<br> * @param e<br> * @return<br> */<br> @ExceptionHandler(value = MethodArgumentNotValidException.class)<br> public Result<?> handleValidException(MethodArgumentNotValidException e){<br> log.error("数据校验出现问题:{},异常类型:{}",e.getMessage(),e.getClass());<br> BindingResult bindingResult = e.getBindingResult();<br> return Result.error(Constants.CODE_400, bindingResult.getFieldErrors().get(0).getDefaultMessage());<br> }
p10 统一包装类
在前后端进行接口数据交互的时候,基本上会要求后台统一返回数据格式
{<br> "code": "200",<br> "message": "success",<br> "data": "具体数据"<br>}
像这样格式的数据该怎样统一返回给前端呢??其实很简单 我们只需要写一个统一包装类就可以了
package com.wg.common;<br><br>import lombok.Data;<br><br>@Data<br>public class Result<T> {<br> private String code;<br> private String message;<br> private T data;<br><br> public Result(String code,String message) {<br> this.code = code;<br> this.message = message;<br> }<br><br> public Result(String code,String message,T data) {<br> this.code = code;<br> this.message = message;<br> this.data = data;<br> }<br> // 请求成功无数据返回<br> public static <T> Result<T> success() {<br> return new Result<T>(Constants.CODE_200, "success");<br> }<br> // 请求成功有数据返回<br> public static <T> Result<T> success(T data) {<br> return new Result<T>(Constants.CODE_200, "success",data);<br> }<br> // 请求失败<br> public static <T> Result<T> error() {<br> return new Result<T>(Constants.CODE_500, "系统异常");<br> }<br> // 请求失败 自定义提示<br> public static <T> Result<T> error(String message) {<br> return new Result<T>(Constants.CODE_500, message);<br> }<br> // 请求失败 自定义提示和状态码<br> public static <T> Result<T> error(String code, String message) {<br> return new Result<T>(code, message);<br> }<br>}<br>
当然, 光有包装类也不是很严谨, 所以我们需要再定义一个 状态码的接口类:
public interface Constants {<br><br> String CODE_200 = "200"; //成功<br> String CODE_401 = "401"; // 权限不足<br> String CODE_400 = "400"; // 参数错误<br> String CODE_500 = "500"; // 系统错误<br> String CODE_600 = "600"; // 其他业务异常<br><br>}
这些状态就是表示咱们业务处理的时候所定义的一些 编码, 这样规定好了以后 在前端就可以做一些处理
业务代码请参照源码及视频讲解
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240424/SpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA%E4%B8%8E%E9%85%8D%E7%BD%AE--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com