SpringBoot学习笔记-S2

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文件,查找并改正文件中的语法错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/527136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10分钟上手:MySQL8的Json格式字段使用总结干货

一、关于效率和适用范围 尽管官方承诺Json格式字段采用了空间换时间的策略&#xff0c;比Text类型来存储Json有大幅度的效率提升。但是Json格式的处理过程仍然效率不及传统关系表&#xff0c;所以什么时候用Json格式字段尤为重要。 只有我们确定系统已经能精确定位到某一行&am…

红外疼痛医学分会成立大会暨首届学术交流会即将盛大开幕

2024年4月7日&#xff0c;中国中医药研究促进会官网发布“关于召开红外疼痛医学分会成立大会暨首届学术交流会的第三轮通知”通知&#xff0c;大会开幕在即&#xff0c;这充分显示了官方对此次活动的高度重视。 本次大会将于 2024年4月19日至21日在重庆海兰云天海琴酒店隆重举行…

memcached集群

一、介绍 memcache本身没有像redis所具备的数据持久化功能&#xff0c;但是可以通过做集群同步的方式&#xff0c;让各memcache服务器的数据进行同步&#xff0c;从而实现数据的一致性&#xff0c;即保证各memcache的数据是一样的&#xff0c;即使有任何一台memcache发生故障&…

Linux addr2line介绍

打开linux调试选项 嵌入式 linux 经常要编译 linux 内核&#xff0c;默认情况下编译出的内核镜像是不带调试信息的&#xff0c;这样&#xff0c;当内核 crash 打印 PC 指针和堆栈信息时&#xff0c;我们需要反汇编来确认出错位置&#xff0c;不直观。 如果内核开启了调试选项&…

K8s学习十(高级调度)

高级调度 CronJob计划任务 在 k8s 中周期性运行计划任务&#xff0c;与 linux 中的 crontab 相同注意点&#xff1a;CronJob 执行的时间是 controller-manager 的时间&#xff0c;所以一定要确保 controller-manager 时间是准确的cron表达式如下&#xff1a; 配置如下&#x…

7.1.4 Selenium 爬取京东商品信息实战

目录 1、实战内容 2、思路 3、分析 url 4、开始操作 1、得到 Cookies 2、访问页面&#xff0c;得到 response 3、解析页面 4、存入 MySQL 5、1-3步总代码 1、实战内容 爬取京东笔记本电脑商品的信息(如&#xff1a;价格、商品名、评论数量)&#xff0c;存入 MySQL 中…

字符串匹配算法之BF与KMP算法

目录 BF算法(暴力匹配算法) KMP算法 核心思想&#xff1a; next数组 next数组的优化 BF算法(暴力匹配算法) #include <assert.h> int BF(const char* str, const char* sub) {assert(str ! NULL && sub ! NULL);if (str NULL || sub NULL){return -1;}int…

962: 括号匹配问题

【学习版】 【C语言】 【C】 #include<iostream>class MyStack { public:struct Node {char val;Node* prev;Node* next;Node(char x) :val(x), prev(NULL),next(NULL) {};};MyStack() {base new Node(0);top base;}bool empty() {return top base;}void push(int …

C++类与对象下(个人笔记)

类与对象下 1.构造函数补充1.1构造函数体赋值1.2初始化列表1.3explicit关键字 2.static成员2.1特性 3.友元3.1友元函数3.2友元类 4.内部类5.匿名对象6.拷贝对象的一些优化7.笔试题 1.构造函数补充 1.1构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xf…

在数字化转型的背景下,如何构建高效的数据资产管理体系?

在数字化转型的大潮中&#xff0c;数据已成为企业创新发展的重要驱动力。如何高效地管理这些数据资产&#xff0c;不仅关系到企业的日常运营&#xff0c;更直接决定了企业能否在激烈的市场竞争中脱颖而出。对于企业管理者或首席信息官&#xff08;CIO&#xff09;而言&#xff…

大学英语ab级题搜题软件?分享7个支持答案和解析的工具 #笔记#其他

合理利用学习辅助工具和资料&#xff0c;可以帮助大学生更好地组织学习内容、掌握知识点和提升学术水平。 1.智能翻译官 这是一款多语言在线翻译神器&#xff0c;除了最基础的英语以外&#xff0c;还支持日语、德语、俄语、法语等几十种语言文本翻译和拍照翻译&#xff0c;并…

一文搞懂从爬楼梯到最小花费(力扣70,746)

文章目录 题目前知动态规划简介动态规划模版 爬楼梯一、思路二、解题方法三、Code 使用最小花费爬楼梯一、思路二、解题方法三、Code 总结 在计算机科学中&#xff0c;动态规划是一种强大的算法范例&#xff0c;用于解决多种优化问题。本文将介绍动态规划的核心思想&#xff0c…

积木-蓝桥每日真题

0积木 - 蓝桥云课 (lanqiao.cn) 题目描述 小明用积木搭了一个城堡。 为了方便&#xff0c;小明在搭的时候用的是一样大小的正方体积木&#xff0c;搭在了一个n行m列的方格图上&#xff0c;每个积木正好占据方格图的一个小方格。 当然&#xff0c;小明的城堡并不是平面的&#x…

2014最新AI智能系统ChatGPT网站源码+Midjourney绘画网站源码+搭建部署教程文档

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

2.SpringBoot利用Thymeleaf实现页面的展示

什么是Thymeleaf&#xff1f; Thymeleaf是一个现代服务器端Java模板引擎&#xff0c;适用于Web和独立环境&#xff0c;能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。 Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这…

代码审计sql注入部分函数绕过方法

目录 1.宽字节注入 2.预编译模式下的sql注入 3无法预编译的 1.3.1. like关键字 1.3.2.不能加单引号 4.相关实战实战 4.1.某个业务网站具有sql注入 4.2.梦想cms代码审计 5.相关参考资料 1.宽字节注入 <?php $dbinit_db(); $db->query("set SET NAMESgbk);…

Thonny 开发环境下使用PICO系列教程2----点亮板载灯3S后熄灭

Thonny 开发环境下使用PICO系列教程2----点亮板载灯3S后熄灭 硬件代码 硬件 链接: 官网地址 参考原理图可以发现&#xff0c;PICO板载灯连接的是GP25引脚 代码 // 板载灯点亮3秒后熄灭 import board //想要控制PICO的引脚就要引入board import time//延迟 from digitali…

【QT入门】Qt自定义控件与样式设计之QPushButton常用qss

往期回顾 【QT入门】Qt自定义控件与样式设计之qss介绍(Qt style sheet)-CSDN博客 【QT入门】 Qt自定义控件与样式设计之qss选择器-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss 这里我们主…

数据结构__顺序表

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改 需要用到数组&#xff1a;数组的绝对优势&#xff1a;下标的随机访问&#xff08;因为物理空间连续&#xff09; a[i]等…

政安晨【AIGC实践】(一):在Kaggle上部署使用Stable Diffusion

目录 简述 开始 配置 执行 安装完毕&#xff0c;一键运行 结果展示 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 人工智能数字虚拟世界实践 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…