【第2章】SpringBoot实战篇之接口参数校验和全局异常处理

news/2024/9/23 10:29:24/

文章目录

  • 前言
  • 一、参数校验
    • 1. 引入库
    • 2. 全局异常处理
    • 3. 控制器类
    • 4. 响应
  • 二、对象校验
    • 1.实体类
    • 2.控制器类
    • 3. 全局异常处理
    • 4. 响应
  • 总结


前言

对接口请求参数校验是每一个开发人员都必须熟知且善用的功能,是保证程序健壮性的基石。

除引入方式不同,使用方式和SpringMvc基本一致。


一、参数校验

1. 引入库

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

2. 全局异常处理

java">package org.example.springboot3.config;import jakarta.validation.ConstraintViolationException;
import org.example.springboot3.bigevent.entity.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** Create by zjg on 2024/5/23*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ConstraintViolationException.class)public Result exceptionHadler(ConstraintViolationException ex){return error(ex);}@ExceptionHandler(Exception.class)public Result exceptionHadler(Exception ex){return error(ex);}private Result error(Exception ex){return Result.error(StringUtils.hasLength(ex.getMessage())?ex.getMessage():"操作失败");}
}

3. 控制器类

package org.example.springboot3.bigevent.controller;import jakarta.validation.constraints.Pattern;
import org.example.springboot3.bigevent.entity.Result;
import org.example.springboot3.bigevent.entity.User;
import org.example.springboot3.bigevent.service.UserSerivce;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Create by zjg on 2024/5/22*/
@RequestMapping("/user/")
@RestController
@Validated
public class UserController1 {@AutowiredUserSerivce userSerivce;@RequestMapping("register")public Result register(@Pattern(regexp = "^\\S{6,20}$",message = "用户名长度为6-20位") String username,@Pattern(regexp = "^\\S{8,20}$",message = "密码为8-20位") String password){User user=userSerivce.findUserByName(username);if(user==null){//用户不存在,可以注册int i=userSerivce.addUser(username,password);if(i!=1){return Result.error("失败注册,请稍后重新注册!");}}else{return Result.error("该用户已存在,请重新注册!");}return Result.success();}
}

4. 响应

{"code":1,"message":"register.username: 用户名长度为6-20位, register.password: 密码为8-20位","data":null}

二、对象校验

上面只有两个参数,我们可以直接校验,但是参数过多的时候我们都会直接使用对象校验。

1.实体类

校验写在实体类对象对应属性上

package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.time.LocalDateTime;@Getter
@Setter
@ToString
public class User {@TableId(type=IdType.AUTO)private Integer id;//主键ID@Pattern(regexp = "^\\S{6,20}$",message = "用户名长度为6-20位")private String username;//用户名@Pattern(regexp = "^\\S{8,20}$",message = "密码为8-20位")private String password;//密码private String nickname;//昵称private String email;//邮箱private String userPic;//用户头像地址private LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间
}

2.控制器类

java">package org.example.springboot3.bigevent.controller;import jakarta.validation.Valid;
import jakarta.validation.constraints.Pattern;
import org.example.springboot3.bigevent.entity.Result;
import org.example.springboot3.bigevent.entity.User;
import org.example.springboot3.bigevent.service.UserSerivce;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Create by zjg on 2024/5/22*/
@RequestMapping("/user/")
@RestController
@Validated
public class UserController1 {@AutowiredUserSerivce userSerivce;@RequestMapping("register1")public Result register1(@Valid User user){if(userSerivce.findUserByName(user.getUsername())==null){//用户不存在,可以注册int i=userSerivce.addUser(user.getUsername(),user.getPassword());if(i!=1){return Result.error("失败注册,请稍后重新注册!");}}else{return Result.error("该用户已存在,请重新注册!");}return Result.success();}
}

3. 全局异常处理

对象数据校验信息太繁琐,我们简化到关键信息

package org.example.springboot3.config;import jakarta.validation.ConstraintViolationException;
import org.example.springboot3.bigevent.entity.Result;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.stream.Collectors;/*** Create by zjg on 2024/5/23*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Result exceptionHadler(MethodArgumentNotValidException ex){//对象数据校验信息太繁琐,我们简化到关键信息BindingResult bindingResult = ex.getBindingResult();if(bindingResult.hasFieldErrors()){String message = bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(";"));return error(message);}return error(ex);}@ExceptionHandler(Exception.class)public Result exceptionHadler(Exception ex){return error(ex);}private Result error(String message){return Result.error(message);}private Result error(Exception ex){return Result.error(StringUtils.hasLength(ex.getMessage())?ex.getMessage():"操作失败");}
}

4. 响应

{"code":1,"message":"用户名长度为6-20位;密码为8-20位","data":null}

总结

回到顶部


http://www.ppmy.cn/news/1465577.html

相关文章

vue3 中可缓存的方法

场景&#xff1a;在列表中&#xff0c;有这么一个属性&#xff0c;需要通过同行的其他属性&#xff0c;进行复杂的计算&#xff0c;才能得出&#xff0c;如果我们用方法&#xff0c;然后传参&#xff0c;得到这个属性&#xff0c;那么每次更改列表后&#xff0c;每行都会重新计…

机器学习-6-对随机梯度下降算法SGD的理解

参考一文带您了解随机梯度下降(Stochastic Gradient Descent):python代码示例 参考sklearn-SGDClassifier 1 梯度下降 在机器学习领域,梯度下降扮演着至关重要的角色。梯度下降是一种优化算法,通过迭代沿着由梯度定义的最陡下降方向,以最小化函数。类似于图中的场景,可以…

【蓝桥杯嵌入式】第十四届省赛 更新中

0 前言 刚刚做完第十四届的省赛&#xff0c;这届题目比我想象中的要简单&#xff1b;不过我去年参加的14届单片机的省赛都比往年的国赛还难&#xff0c;挺离谱的~ 1 展示 1.1 源码 1.2 演示视频 1.3 题目展示 2 CubeMX配置(第十四届省赛真题) 设置下载线 HSE时钟设置 时钟树…

C++容器之前向链表(std::forward_list)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 access3.6 assign3.7 emplace_front3.8 push_front3.9 pop_front3.10 emplace_after3.11 insert_after

JVM 虚拟机

JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机&#xff0c;虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有&#xff1a;JVM、VMwave、Virtual Box等。JVM 是一台被定制过的现实当中不存在的计算…

CentOS 7基础操作03_Linux命令的分类

1、Linux命令的分类 Linux命令的执行必须依赖于 Shell命令解释器。Shell实际上是在Linux操作系统中运行的一种特殊程序,它位于操作系统内核与用户之间&#xff0c;负责接收用户输入的命令并进行解释&#xff0e;将需要执行的操作传递给系统内核执行&#xff0c;Shell在用户和内…

RestTemplate中multipart form data传多个参数的处理办法

应用场景 前端请求后端上传单个或多个文件&#xff0c;同时携带其他参数&#xff0c;后端再转发到第三方服务。 思路 拿到前端提交的multipart参数读取参数并区分文件/其他参数请求第三方 实现 拿到前端提交的参数并解析到MultiValueMap&#xff1a; private static Mult…

行为设计模式之策略模式

文章目录 概述原理结构图 代码实现小结 概述 策略模式(strategy pattern)的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。 在软件开发中也会遇到相似的情况&…