springboot validated注解数据校验 异常处理

news2024/12/26 9:20:04

springboot validated 数据校验

  • validated 数据校验

简单的写一下这个用法啊,清晰的本篇文章就记录这个注解的一个用法。

validated 数据校验

我们一般的数据校验是怎么用的?在常规模式下我们可能就是在前端去通过js去判断?还是在后端重新查找数据库,当然还是有其它的方法,在这里介绍一个注解validated这个注解,我们结合springboot 去使用。这样就容易很多。

首先呢,我们需要在pom中导入这个注解需要的依赖。

这里建议就这样做了。

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

这是和springboot整合起来的这样的一个注解,现在大概就是2.3以上的版本使
用了,我们直接导入这个整合的依赖。导入其他形式的依赖可能会不起作用。

这里展示一个校验,也是比较简单的。
我们这里从登录校验开始说明
我们可以把它用在这里User实体类的接收参数上。 User是我们的实体类,我们用这个实体类修饰的参数来接收前端传来的数据。当然你这里要保证封装的字段和实体类字段一致,当然你也可以进行其它处理。

在这里插入图片描述
然后就去实体类进行一个几个操作。
我们来举例两个,当然这个注解功能还是非常方便的。

在这里插入图片描述
当然我们班也可以去指定邮箱的格式,同样一个字段上可以加多个校验注解。
在这里插入图片描述
其他的自己去查找就是了,这里只是说明一下使用的方法。
我们加了校验注解后,如何去配合使用呢?

我们可以去做一个全局异常捕获的处理类,当然怎么样封装我们可以自己去做。

代码如下

package jgdabc_.ExceptionHander;

import jgdabc_.common.R_;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author 兰舟千帆
 * @version 1.0
 * @date 2022/12/9 21:06
 */
@ControllerAdvice(annotations = Controller.class)
@Slf4j
//做一个捕获参数校验异常的类
public class GlobalDefaultExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(GlobalDefaultExceptionHandler.class);
    //捕获校验失败的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    //设置响应状态码,当然这里其实我并没有用上,我自己在R_对象封装了
    @ResponseStatus(HttpStatus.OK)
    public R_ handleParamCheckExcepion(HttpServletRequest req, MethodArgumentNotValidException ex) {
    //那下面这里就是读取具体的校验失败的数据了,可能不是一个,所以其实有一个遍历的过程。
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder paramErrorMsg = new StringBuilder();
        if (bindingResult.hasErrors()) {

            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError : allErrors) {
                String msg = objectError.getDefaultMessage();
                if (paramErrorMsg.length() == 0) {
                    paramErrorMsg.append(msg);
                } else {
                    paramErrorMsg.append(',');
                    paramErrorMsg.append(msg);
                }
            }
        }
        //这里我们输出了错误的日志
        logger.error("参数校验失败! uri:{},错误信息:{}", req.getRequestURI(), paramErrorMsg.toString());
        //这里我用R_对象去封装返回了
        return R_.error(paramErrorMsg.toString());
    }
}

R_实体是做的一个实体封装类,其实是一个泛型类。泛型的方便指出在这里可以体现出来。来看R_。一直在用这个,作为工具类很方便嘿嘿。

package jgdabc_.common;

import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

//通用返回结果,这里其实就是一个泛型封装类
@Data
public class R_<T>implements Serializable {

    private Integer code; //编码:1成功,0和其它数字为失败

    private String msg; //错误信息

    private T data; //数据

    private Map map = new HashMap(); //动态数据
//这样的泛型设计非常巧妙了
    public static <T> R_<T> success(T object) {
        R_<T> r = new R_<T>();
        r.data = object;//这里可以接收到返回的值
        r.code = 1;
        return r;
    }

    public static <T> R_<T> error(String msg) {
        R_ r = new R_();
        r.msg = msg;
        r.code = 0;
        return r;
    }

    public R_<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

}

前台我们直接这样取就可以了。当然前端怎么写自己可以搞,我们具体的逻辑就是这样。
在这里插入图片描述
在这里插入图片描述

这里啊,其实就是直接从这里来捕获校验了。在这里接收封装参数校验后,出现校验问题的话,会直接跑到异常捕获里面,并不会执行方法内部的·1逻辑,其实这里响应也是比较快的。
在这里插入图片描述

ok,后面追加一篇登录注册校验的逻辑,我们用注解校验和前端js校验两种方式,具体都写下来来进行对比。本篇就到这里。

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

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

相关文章

【C语言字符串相关函数大全】

【C语言字符串相关函数大全】【1】atof【2】atoi【3】atol【4】isalnum【5】isdigit【6】islower【7】isupper【8】isprint【9】memchr【10】memcmp【11】memcpy【12】memset【13】strcat【14】strchr【15】strcmp【16】strpbrk【17】strstr【18】strtok【19】源码【20】源码执…

Mipmap的作用以及其优势和缺点

Mipmap的作用以及其优势和缺点 定义 Mipmap,又叫做多级渐进贴图纹理映射,作用在游戏的纹理贴图,根据渲染物体距离相机的远近,选用不同大小的纹理贴图; 作用 可以使得远处的像素不发生闪烁;减小带宽;减小带宽的原理 说到MipMap可能很多人都会觉得,只是开启后会增加内…

Vue3 学习笔记 —— 函数式编程、createVNode、render、h 函数

目录 2. createVNode()、render() 2.1 初步使用 createVNode()、render() 2.2 h 函数源码分析 3. 使用 h 函数的几种方法 3.1 h 函数 接收的参数 3.2 h 函数 使用方法 4. 通过 h 函数实现 button 组件 4.1 使用 props 接收传入组件的参数 4.2 使用 emit 向组件外发送事…

自动化运维工具—Ansible概述及命令行模块

一.自动化运维工具—Ansible概述及命令行模块 1.1 Ansible是什么 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可…

机器人手臂四旋翼的笛卡尔阻抗控制(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 当机器人手指与障碍物接触时,呈现出2阶机械阻抗特性。在阻抗控制算法中,不需直接计算加速度,从而避免了因大加速度误差给控制带…

leetcode 473. 火柴拼正方形-思路整理与细节分析

题目&#xff1a; 你将得到一个整数数组matchsticks&#xff0c;其中 matchsticks[i]是第i个火柴棒的长度。你要用所有的火柴棍拼成一个正方形。你不能折断任何一根火柴棒&#xff0c;但你可以把它们连在一起&#xff0c;而且每根火柴棒必须使用一次。如果你能使这个正方形&am…

FPGA新起点V1开发板(五)——Modelsim软件的使用(联合仿真)

文章目录一、简介1.1 前仿真1.2 后仿真二、联合仿真2.1 选择modesim的安装路径2.2 设置选择eda的工具2.3 test bench文件2.4 打开test bench文件2.5 给系统时钟和复位信号赋初值2.6 配置仿真功能三、RTL仿真3.1 打开波形窗口3.2添加内部信号四、时序仿真一、简介 1.1 前仿真 主…

web大学生网页作业成品 响应式网站水果超市7页(html+css+javascript+jquery+bootstarp)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

web期末大作业 用HTML+CSS做一个漂亮简单的节日网页【传日文化节日中秋节】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

web前端期末大作业—— HTML+CSS豪华车 (9页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

蚂蚁金服开源的这份SpringBoot笔记,曾在24小时内GitHub星标48k

前言 Spring的影响力想必就不用小编多说了&#xff0c;今天要跟大家说的是SpringBoot。Spring Boot作为目前Spring技术体系中炙手可热的框架之一&#xff0c;已经是开发者们的必备神器了。在实际的项目中&#xff0c;需要集成各种的插件支持&#xff0c;还有很多或许我们平时不…

【计算机考研408-计算机网络-教书匠视频笔记】主机访问浏览器的全部过程

主机H1利用浏览器通过该域名请求访问web服务器 由于题目给定主机H1的ARP表是空的 &#xff08;1&#xff09;主机H1首先会发送ARP请求报文&#xff0c;ARP请求报文会被封装在以太网的MAC帧中发送 ARP请求报文&#xff1a;FF-FF-FF-FF-FF-FF 源MAC地址&#xff1a;00-11-22-3…

Docker 容器使用

文章目录Docker 容器使用Docker 客户端运行一个web应用查看 WEB 应用容器网络端口的快捷方式查看WEB应用程序日志查看WEB应用程序容器的进程检查WEB应用程序停止WEB应用容器重启WEB应用容器移除WEB应用容器Docker 容器使用 Docker 客户端 docker 客户端非常简单 ,我们可以直接…

全网显示 IP 归属地,用上这个开源库,实现也太简单了

细心的小伙伴可能会发现&#xff0c;最近蘑菇新上线了 IP 属地的功能&#xff0c;小伙伴在发表动态、发表评论以及聊天的时候&#xff0c;都会显示自己的 IP 属地信息 动态显示IP属地 在蘑菇群聊中&#xff0c;也 可 以 展 示 IP 属 地&#xff0c;下面是小伙伴们在交流群中显…

【强化学习论文合集】十八.2019国际表征学习大会论文(ICLR2019)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

面试官:你觉得你最大的缺点是什么?

面试官:你觉得你最大的缺点是什么? 前言 相信百分之80的同学们都会被问到这个问题&#xff1a;你觉得你最大的缺点是什么? 这也是求职者一个充满恐惧的问题&#xff0c;特别是我们程序员&#xff0c;大家在与人沟通并没有我们与代码沟通这么得心应手&#xff0c;如果你没回…

网络请求工具wget和curl

一. wget命令 wget命令来自于英文词组”web get“的缩写&#xff0c;其功能是用于从指定网址下载网络文件。 wget命令支持如HTTP、HTTPS、FTP等常见协议&#xff0c;可以在命令行中直接下载网络文件。 注意&#xff1a;不同busybox版本集成的wget命令&#xff0c;可能不…

统计检验分析

1. 正态分布检验 2. 统计检验 正态分布且方差齐非正态分布或方差不齐para test non-para testnon-pairedpaired2组 t-testWilcoxon rank-sum testWilcoxon signed-rank test3组及以上One way ANOVA Kruskal-Wallis testt-test: Paired t-test: 确定某个总体的成对测量值之间…

说说WM_DESTROY和WM_NCDESTROY的区别

在一个 Windows 窗口被销毁的时候&#xff0c;你会发现有两个比较类似的消息&#xff1a;WM_DESTROY和WM_NCDESTROY&#xff0c;那么&#xff0c;这俩兄弟之间有什么区别呢&#xff1f;今天就来讲讲。 不同之处在于&#xff0c;WM_DESTROY消息在窗口销毁序列的开头发送&#x…

MySQL执行计划误选索引及修改方案

MySQL的优化器 MySQL在执行查询语句时使用那个索引是由server层的优化器决定的。优化器的作用是找到一个最优的执行方案&#xff0c;用最小的代价去执行语句。由于MySQL使用预估的方式去选择索引&#xff0c;所以MySQL可能会出现选择索引出错的情况&#xff0c;无法命中最优索…