小白初学SpringBoot记录

news2025/6/9 4:54:50

1.对于通过json返回用户信息时,需要忽略password字段操作:

1.1 pom配置jackson细节:

        

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.14.2</version>
    </dependency>

在对应表的类加上注解(@JsonIgnoreProperties({"password"}))

@Data
@JsonIgnoreProperties({"password"})
public class User {
    private Integer id;//主键ID
    private String username; // 用户名
      //返回 的数据里忽略密码
    private String password;// 密码
    private String nickname; //昵称
    private String email;//邮箱
    private String userPic;// 用户头像
    private LocalDateTime createTime;// 创建时间
    private LocalDateTime updateTime;// 更新时间
}

返回数据的泛型类如下:
 

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {
    private Integer code;
    private String message;
    private T data;

    public static <E> Result success(E data){
      return new Result<>(0,"操作成功",data);
    }

  public static Result success(){
    return new Result<>(0,"操作成功",null);
  }

  public static  Result error(String message){
    return new Result<>(1,message,null);
  }
}

返回用户信息的路由信息:

   @GetMapping("/userinfo")
    public Result<User> getUserinfo(@RequestHeader(name="Authorization") String token){
      try {
        Map<String, Object> stringObjectMap = JwtUtils.parseToken(token);
        String name = (String)stringObjectMap.get("username");
        User byName = userService.findByName(name);
        return Result.success(byName);
      }catch (Exception e){
        return Result.error("Token 过期");
      }
    }

2.添加拦截器,对除了部分请求外的所有请求进行JWT验证:

 继承HandlerInterceptor接口,并且实现接口preHandle,

package org.example.Interceptors;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import org.example.utils.JwtUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class LoginInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    String token = request.getHeader("Authorization");
    try {
      JwtUtils.parseToken(token);
      return true;
    }catch (Exception e){
      response.setStatus(401);
      return false;
    }
  }
}

注册拦截器的实现:其中(excludePathPatterns("/user/login","user/register") 操作会忽略这个请求路径下的JWT验证)

package org.example.config;

import org.example.Interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

  @Autowired
  private LoginInterceptor loginInterceptor;
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","user/register");
  }
}

3.路由接口的参数校验使用validation

pom.xml 添加如下配置:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

对于对应的controller类添加如下注解:

@Validated
public class UserController {
。。。
}

3.1普通参数类型校验

对于登录接口参数的校验如下:

@PostMapping("/login")
public Result login(@Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9]{4,16}$") String username,@Pattern(regexp = "^[a-zA-Z0-9]{5,16}$") String password){}

可以添加Pattern注解,并使用正则表达式验证。@Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9]{4,16}$")

3.2对于类对象格式校验:

此方法存在controller类内
 

   @PutMapping("/update")
    public Result updateUserInfo(@RequestBody @Validated User user){}
@RequestBody 用户获取用户json格式传过来的参数,直接初始化类User。

User类如下:

@Data
@NoArgsConstructor
@JsonIgnoreProperties({"password"})
public class User {
    @NonNull
    private Integer id;//主键ID
    private String username; // 用户名
      //返回 的数据里忽略密码
    private String password;// 密码
    @NotEmpty
    @Pattern(regexp = "^[a-zA-Z0-9]{5,10}$")
    private String nickname; //昵称
    @NotEmpty
    @Email
    private String email;//邮箱
    private String userPic;// 用户头像
    private LocalDateTime createTime;// 创建时间
    private LocalDateTime updateTime;// 更新时间
}

@Data注解是lombok依赖,可以在编译的时候帮助生成默认的getter,setter方法。

pom.xml添加如下:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.32</version>
</dependency>

对于类对象的属性值校验使用的

@NonNull  不为null
@NotEmpty   不为null并且字符串时不为空
@Pattern(regexp = "^[a-zA-Z0-9]{5,10}$") 正则校验传入的别名
@Email 邮箱格式校验

在未添加 注解@NoArgsConstructor时,从postman模拟update时出现如下错误:
Cannot construct instance of `org.example.pojo.User` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

​原因:缺少无参构造器​
Jackson 反序列化时​​必须通过无参构造器创建对象​​,再通过 Setter 注入属性

  • 当前类使用 Lombok @Data 注解,但​​未显式添加 @NoArgsConstructor​,导致编译后无默认构造器
  • 即使 Lombok 默认生成无参构造器,若存在其他构造器(如全参构造器),则不再自动生成

因此需要加上@NoArgsConstructor注解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤

一、靶机介绍 靶机地址&#xff1a;https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度&#xff1a;中级&#xff08;CTF&#xff09; 靶机发布日期&#xff1a;2018年3月21日 靶机描述&#xff1a; Boot2root挑战旨在创建一个安全的环境&…

PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载

MinerU发布至今我已经更新多版整合包了&#xff0c;5天前MinerU发布了第一个正式版1.0.1&#xff0c;并且看到在18小时之前有更新模型文件&#xff0c;我就做了个最新版的一键启动整合包。 2025年02月21日更新v1.1.0版整合包 2025年02月27日更新v1.2.0版整合包 2025-06-05 更…

【深入学习Linux】System V共享内存

目录 前言 一、共享内存是什么&#xff1f; 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1&#xff09;key与shmid的区别与联系 2&#xff09;再理解key 3&#xff09;通过指令查看/释放系统中…

编程基础:执行流

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 执行流同步&#xff1a;顺序执行&#xff0c;只有一个执行流异步&#xff1a;新开后台(次)执行流&#xff0c;后台执行流要确保不能影响主执行流。共有两个执行流。 阻塞&#xff1a;任务阻塞执行流&#xff0c;导致…

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用

作者&#xff1a;来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会&#xff0c;了解如何超越 RAG 基础&#xff0c;或使用 Elastic 向量数据…

[面试精选] 0094. 二叉树的中序遍历

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习&#xff0c;需要学习如何预处理原始数据&#xff0c;这里用到pandas&#xff0c;将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…

2025年6月6日第一轮

2025年6月6日 The rapid in Chiese industdy is developnig e,and it is From be in a enjoy a deep is developing The drone industry in China is developing The drone industy in china develops rapidly and is in a leading position in in the world. The dro…

12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入

一、Oracle 23ai Vector Embeddings 核心概念​ 向量嵌入&#xff08;Vector Embeddings&#xff09;​​ -- 将非结构化数据&#xff08;文本/图像&#xff09;转换为数值向量 - - 捕获数据的语义含义而非原始内容 - 示例&#xff1a;"数据库" → [0.24, -0.78, 0.5…

pytorch 与 张量的处理

系列文章目录 文章目录 系列文章目录一、Tensor 的裁剪二、Tensor 的索引与数据筛选torch.wheretorch.indicestorch.gathertorch.masked_selecttorch.taketorch.nonzero&#xff08;省略&#xff09; 三、Tensor 的组合与拼接torch.cattorch.stack 四、Tensor的切片chunksplit …

layer norm和 rms norm 对比

Layer norm # Layer Norm 公式 mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, keepdimTrue) output (x - mean) / sqrt(var eps) * gamma beta特点&#xff1a; 减去均值&#xff08;去中心化&#xff09;除以标准差&#xff08;标准化&#xff09;包含可学习参数 …

Java高级 | 【实验六】Springboot文件上传和下载

隶属文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…

VBA进度条ProgressForm1

上一章《VBA如何使用ProgressBar进度条控件》介绍了ProgressBar控件的使用方法&#xff0c;今天我给大家介绍ProgressForm1进度条的使用方法&#xff0c;ProgressForm1是集成ProgressBar控件和Label控件的窗体&#xff0c;可以同时显示进度条和百分比&#xff0c;如下图&#x…

行为型设计模式之Interpreter(解释器)

行为型设计模式之Interpreter&#xff08;解释器&#xff09; 前言&#xff1a; 自己的话理解&#xff1a;自定义一个解释器用来校验参数或数据是否合法。 1&#xff09;意图 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解…

深入解析 CAS 操作

一、CAS 的本质&#xff1a;硬件级别的乐观锁 CAS&#xff08;Compare-And-Swap&#xff0c;比较并交换&#xff09; 是一种原子操作指令&#xff0c;用于实现对共享变量的无锁并发修改。它是现代多核处理器支持的底层硬件指令&#xff0c;也是构建高效并发数据结构&#xff0…

vue3+TS+eslint9配置

记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中&#xff0c;配置方式发生了变化。Flat Config 格式&#xff08;eslint.config.js 或 .ts&#xff09;不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉&#xff0c;要不然保存的时候不会格式化。…

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)

在使用ocrmypdf的时候&#xff0c;需要Ghostscript9.55及以上的版本&#xff0c;但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够&#xff0c;因此去官网https://ghostscript.c…

Redis :String类型

String类型 String是Redis中的字符串&#xff0c;是Redis中最基本的数据类型&#xff0c;直接是按照二进制数据的进行存储 Redis中的所有key都是String类型&#xff0c;但是value是有差别的 常见的命令 set 将String类型的value存储到key中&#xff0c;如果之间有相同的ke…

第18节 Node.js Web 模块

什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序。 Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL&#xff0c;与客户端的网络浏览器配合。 大多数web服务器都支持服务…

网络爬虫一课一得

网页爬虫&#xff08;Web Crawler&#xff09;是一种自动化程序&#xff0c;通过模拟人类浏览行为&#xff0c;从互联网上抓取、解析和存储网页数据。其核心作用是高效获取并结构化网络信息&#xff0c;为后续分析和应用提供数据基础。以下是其详细作用和用途方向&#xff1a; …