1. SpringBoot中的常见注解
@RequestBody
:使SpringMVC框架可自动读取请求体里面的JSON格式的数据,转换成map类型的集合对象@RestController
:开发RESTful API 时使用,等价于@ResponseBody +
@Controller。@RestController和@Controller的都可用来表示Spring某个类是否可以接收HTTP请求,@RestController可以直接返回数据,但无法返回指定页面;而@Controller需要@ResponseBody辅助,但可以返回指定页面。@Validated
:@Validation是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束。通常包括下列参数校验:
@NotNull //值不能为null
@NotEmpty //值不能为null,并且内容不为空
@Email //满足邮箱格式
@JsonFormat(shape=JsonFormat.Shape.STRING,pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") //规定日期和时间格式
2. JWT(JSON Web Token)的使用
定义一种简洁的、自包含的格式,双方以json数据格式安全传输信息。采用Base64
,一种基于64个可打印字符(A-Z a-z 0-9 + /)
来表示二进制数据的编码方式。
- Header(头部):记录令牌类型、签名算法
- Payload(有效载荷):携带自定义信息、默认信息,不能存放密码等私密信息
- Signature(签名):防止Token被篡改、确保安全性
生成JWT Token的代码如下:
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
private static final String KEY = "uatr";
// 生成token
public static String genToken(Map<String, Object> claims){
return JWT.create()
.withClaim("claims", claims)
.withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))
.sign(Algorithm.HMAC256(KEY));
}
//解析并验证token
public static Map<String, Object> parseToken(String token){
return JWT.require(Algorithm.HMAC256(KEY))
.build()
.verify(token)
.getClaim("claims")
.asMap();
}
}
3. ThreadLocal的使用
3.1 功能
主要用于提供线程局部变量
- 用来存取数据:可包含setter/getter、toString()、无参构造、有参构造等
- 使用 ThreadLocal存储的数据,可以保证线程安全
- 提供一个全局的ThreadLocal可以多次调用userID、userName等内容
3.2 意义
- 可减少参数的传递(无需在多个地方重新声明参数)
- 可以把拦截器中的数据共享到
Controller
、Sercvice
、Dao
等进行使用
3.3 拦截器工具类
public class ThreadLocalUtil {
// 提供ThreadLocal对象
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
//根据键获取值
public static<T> T get() { return (T) THREAD_LOCAL.get();}
// 存储键值对
public static void set(Object value){ THREAD_LOCAL.set(value);}
// 清除ThreadLocal,防止内存泄漏
public static void remove(){THREAD_LOCAL.remove();}
}
4. MyBatis中#{ }和${ }的区别
#{ }
和${ }
均是MyBatis的占位符。
- #{ }:如果参数值是字符串类型,则会自动拼接上前后的单引号,且在赋值时进行转义操作,有效防止SQL注入
- ${ }:简单拼接字符串,不会添加字符串前后的引号
5. 配置MyBatis时的常见问题及解决方案
5.1 Failed to configure a DataSource
- 错误解释:配置数据源失败
- 原因分析:配置
pom.xml
时build
标签配置出错 - 解决方案:检查
pom.xml
文件中的配置结构,可参照如下结构配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--让当前工程继承父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</parent>
<groupId>com.uatr.sys</groupId>
<artifactId>uatr_system</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>uatr_system</name>
<description>uatr_system</description>
<url>https://maven.apache.org</url>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<!--thymeleaf-->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>-->
<!-- web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--validation依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--java-JWT坐标-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
5.2 Caused by: org.springframework.beans.factory.BeanCreationException
- 错误解释:Bean对象创建失败,发生了BeanCreationException
- 原因分析:
mybatis
的配置文件中,mapper映射配置出错,找不到Bean对象对应的映射。可能因为mapper中既没有写SQL相关注解,也没有在resources
文件夹中编写mapper对应SQL操作的xml
文件,或者配置路径有错误。 - 解决方案:首先排除没有编写SQL操作的注解或者
xml
文件,如果确定xml
文件存在,则检查配置pom.xml
文件中的配置,如5.1节
代码所示,将resources
目录和.yml
、.properties
、.xml
均添加到里面。
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
5.3 Consider defining a bean of type ‘xxx’ in your configuration
- 错误解释:Cotroller中的Service需要一个类型相对应的Bean
- 原因分析:mapper中的
xml
文件有问题,与mapper接口文件不匹配,导致service层和controller层找不到对应的可操作的Bean对象。 - 解决方案:更改文件夹
resources
中mapper对应的xml
文件,查找并改正文件中的语法错误。