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

文章目录

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


前言

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

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


一、参数校验

1. 引入库

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

2. 全局异常处理

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.控制器类

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.mzph.cn/diannao/20557.shtml

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

相关文章

从零到一的程序猿-day2-yoloV4训练及免环境易语言调用

简介 本项目功能介绍&#xff1a;针对4位英文数字随机组合的验证码抽象图片进行分类识别&#xff0c;识别结果为验证码内容 训练 没有难度&#xff0c;手动标注&#xff0c;样本为150张&#xff0c;首先识别出图片中每个英数的位置&#xff0c;再由分类器进行标注识别&#x…

Github:ChatTTS从下载到使用

前言 本文使用工具&#xff1a; Anaconda &#xff1a;直接进行包管理&#xff0c;用来自定义生成python解释器&#xff0c;虚拟环境vscode&#xff1a;用来执行代码 注&#xff1a;我使用的Ubuntu&#xff0c;使用win&#xff0c;mac等&#xff0c;需要额外配置 简介 Chat…

【环境栏Composer】Composer常见问题(持续更新)

1、执行composer install提示当前目录中没有 composer.lock 文件时 No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. Composer 在执行 install 命令时会…

浅谈大模型的优缺点以及优化方法

引言 人工智能大模型&#xff0c;如深度学习模型、神经网络模型等&#xff0c;已经改变了我们对数据处理和分析的方式。然而&#xff0c;尽管它们在各种应用中表现出色&#xff0c;但也存在一些挑战和限制。本文将详细探讨人工智能大模型的优点和缺点&#xff0c;并提出一些方…

【第六节】C++中的模板

目录 前言 一、函数模板 二、模块特化 三、重载函数模板 四、类模板 五、总结 前言 模板是C编程中的一种强大工具&#xff0c;它允许程序员创建具有通用数据类型的函数库和类库。作为支持参数多态性的机制&#xff0c;模板极大地增强了代码的复用性和灵活性。 在C语言中&#x…

Pytorch线性回归

使用pytorch来重现线性模型的过程&#xff0c;构造神经网络module&#xff0c;构造损失函数loss&#xff0c;构造随机梯度下降的优化器sgd。 一 revise 首先确定我们的模型&#xff0c;我们希望完成的目标就是得到较小的loss&#xff0c;所以我们就需要一个标量值的loss。 那…

YOLOv10(2):网络结构及其检测模型代码部分阅读

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据-CSDN博客 目录 1. 写在前面 2. 局部模块 &#xff08;1&#xff09;SCDown &#xff08;2&#xff09;C2fCIB &#xff08;3&#xff09;PSA(partial self-attention) 3. 代码解读 &#x…

手把手教大家如何使用Kaggle平台的免费GPU资源跑深度学习模型

如果手头没有GPU资源是没法很好进行学习和实操各种深度学习模型的&#xff0c;所幸有一些平台提供了GPU资源供广大兴趣爱好者进行免费使用。 一、免费GPU资源的平台 1. Google Colab 地址&#xff1a;https://colab.research.google.com/ 简介&#xff1a;Google Colab&…

ssm_mysql_高校自习室预约系统(源码)

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

思科防火墙配置内网地址 配置PAT 思科防火墙还是不能访问外网?

环境: 思科设备 frp2100 问题描述: 思科防火墙配置内网地址 配置PAT 思科防火墙还是不能访问外网? 解决方案: 要配置思科ASA防火墙以便内网用户可以访问外网,通常会使用PAT(端口地址转换),这里是一个基本的配置流程示例。请注意,以下步骤假定你已具备必要的网络知…

kubernetes之etcd基本操作

etcd常用操作 拷贝etcd命令行工具查看etcd集群节点查看etcd集群监控状态查看etcd集群节点状态查看etcd集群内的所有key查看etcd集群内对应key的valueetcd备份etcd恢复 拷贝etcd命令行工具 rootmaster2:~# find / -iname "etcdctl" /var/lib/docker/overlay2/70f2d53…

在mongodb5.0.11版本中创建用户和授权

目录 处理原因&#xff1a; 1、设定mongodb的环境变量 2、登录mongodb 3、使用admin库 4、创建 mongouser用户 5、更新 mongouser 可使用的库 6、创建 mongouser角色授权 7、更新root账号也可以使用 mongouser角色 处理原因&#xff1a; 在MongoDB中&#xff0c;root角…

throw和throws的区别是什么?

在Java编程语言中&#xff0c;throw和throws都是与异常处理相关的关键字&#xff0c;但它们在使用方式和作用上有着明显的区别。下面将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细解释它们之间的区别。 一、技术难点 throw&#xff1a;throw关键字用于在程…

IDEA中,MybatisPlus整合Spring项目的基础用法

一、本文涉及的知识点【重点】 IDEA中使用MybatisPlus生成代码&#xff0c;并使用。 Spring整合了Mybatis框架后&#xff0c;开发变得方便了很多&#xff0c;然而&#xff0c;Mapper、Service和XML文件&#xff0c;在Spring开发中常常会重复地使用&#xff0c;每一次的创建、修…

关键主题汇编

用户使用双屏扩展桌面类软件时,所遇到的主要疑难问题汇编 https://exesoft.blog.csdn.net/article/details/43116867 知识竞赛现场管理系统安装配置及使用疑难问题汇编 https://exesoft.blog.csdn.net/article/details/53457491 关于知识竞赛现场管理系统内置的第三方答题平…

【杂记-浅谈XSS跨站脚本攻击】

一、什么是XSS&#xff1f; XSS&#xff0c;Cross-site Scripting&#xff0c;跨站脚本攻击&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;攻击者利用Web程序对用户输入检查不足的漏洞将可执行恶意脚本注入网站或Web应用&#xff0c;当用户访问网页时触发恶意脚本的…

App Web前端怎么开发:深入解析与开发实践

App Web前端怎么开发&#xff1a;深入解析与开发实践 在当今数字化时代&#xff0c;Web前端作为连接用户与应用程序的桥梁&#xff0c;其重要性不言而喻。对于想要涉足App Web前端开发的开发者而言&#xff0c;理解并掌握开发流程、技术栈以及最佳实践是至关重要的。本文将分四…

milvus向量数据库

Milvus 是一个开源的向量数据库&#xff0c;用于管理、搜索和分析高维向量数据。它特别适用于处理像图像、视频、音频和文本等非结构化数据。以下是关于 Milvus 向量数据库的详细介绍和入门教程。 ### Milvus 简介 Milvus 的主要特性包括&#xff1a; 1. **高性能**&#xf…

权限修饰符和代码块

一.权限修饰符 1.权限修饰符:是用来控制一个成员能够被访问的范围的。 2.可以修饰成员变量&#xff0c;方法&#xff0c;构造方法,内部类。 3.例子&#xff1a; public class Student {priviate String name;prviate int age;} 二.权限修饰符的分类 有四种作用范围大小…

自然语言处理中的RNN、LSTM、TextCNN和Transformer比较

引言 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;理解和应用各种模型架构是必不可少的。本文将介绍几种常见的深度学习模型架构&#xff1a;RNN&#xff08;循环神经网络&#xff09;、LSTM&#xff08;长短期记忆网络&#xff09;、TextCNN&#xff08;文本卷…