首页 > 其他分享 >SpringBoot学习笔记-S2

SpringBoot学习笔记-S2

时间:2024-04-05 19:59:35浏览次数:23  
标签:xml SpringBoot S2 boot 笔记 ThreadLocal spring org public

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 意义

  • 可减少参数的传递(无需在多个地方重新声明参数)
  • 可以把拦截器中的数据共享到ControllerSercviceDao等进行使用

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.xmlbuild标签配置出错
  • 解决方案:检查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文件,查找并改正文件中的语法错误。

标签:xml,SpringBoot,S2,boot,笔记,ThreadLocal,spring,org,public
From: https://blog.csdn.net/qq_42074210/article/details/136504103

相关文章