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";// 生成tokenpublic 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));}//解析并验证tokenpublic 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
文件,查找并改正文件中的语法错误。