BindingResult 穿越校验 合并统一异常拦截校验

问题场景:      

         项目前后端对接时,前端调用服务端接口进行入参校验时,服务器和浏览器需要进行双向校验。在统一传参对象时,需要对一些入参字段进行判空,判长度,格式校验

第一种方案可以直接在对象实体的字段上使用相应注解

相关的校验API:
空检查
@NotEmpty:用在集合类上面;不能为null,而且长度必须大于0
@NotBlank: 用在String上面;只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotNull:用在基本类型上;不能为null,但可以为empty。

长度检查
@Size(min=,max=):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
不要错用了异常类型,比如在int上不可用@size
@Length(min=, max=) : 只适用于String 类型

Booelan检查
@AssertTrue: 验证 Boolean 对象是否为 true
@AssertFalse: 验证 Boolean 对象是否为 false

日期检查
@Past: 验证 Date 和 Calendar 对象是否在当前时间之前
@Future: 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern: 验证 String 对象是否符合正则表达式的规则

其他验证:
@Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
@URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法URL

第二种方案,如果入参比较少,也可直接取参数进行if else 判断,并对异常参数进行return 异常提示,这种直白的方式,在多代码编写时,费事费力,不推荐
第三种方案,也是比较建议的方式,在服务端接口传参处使用BindingResult

        BindingResult是Spring框架中的一个核心接口,用于处理数据校验的结果,确保数据的合法性,BindingResult需要配合校验器Validator一起使用,在传入的对象前使用@Valid

public GraceJSONResult saveOrUpdate(@Valid SaveBO saveBO,BindingResult result) {
// 判断BindingResult是否保存错误的验证信息,如果有,则直接return
       if (result.hasErrors()) {
           Map<String, String> errorMap = getErrors(result);
           return GraceJSONResult.errorMap(errorMap);
       }
}

如果入参没有按要求传,就可以统一返回异常,如下

方案优化:
使用BindingResult可以极大省去前后端参数的校验,但像上面每个对接的服务端接口都要判断BindingResult里是否存在错误验证信息并返回,代码还是太冗余,所以进行进一步封装,将该机制放到整个服务端的统一异常拦截器里。

        Spring提供了一个方法参数校验的异常类MethodArgumentNotValidException ,它会在所有接口接收前先进行拦截校验,如下


/**
 * 统一异常拦截处理
 * 可以针对异常的类型进行捕获,然后返回json信息到前端
 */
@ControllerAdvice
public class GraceExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public GraceJSONResult returnException(MethodArgumentNotValidException e) {
        BindingResult result = e.getBindingResult();
        Map<String, String> errors = getErrors(result);
        return GraceJSONResult.errorMap(errors);
    }

    public Map<String, String> getErrors(BindingResult result) {
        Map<String, String> map = new HashMap<>();
        List<FieldError> errorList = result.getFieldErrors();
        for (FieldError fieldError : errorList) {
            String field = fieldError.getField();
            String defaultMessage = fieldError.getDefaultMessage();
            map.put(field, defaultMessage);
        }
        return map;
    }
}

 使用统一的异常拦截后,服务端的接口参数校验就不需要每个接口都配置,依然可以实现验证效果,主打一个实现功能的前提下,能少写代码就少写,能不写就不写。

end

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

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

相关文章

Windows11编译VTM源码生成Visual Studio 工程

VTM介绍 VTM作为H266/VVC标准的官方参考软件&#xff0c;一直用作H266/VVC标准的研究和迭代。关于H2666/VVC标准的介绍、代码、提案、文档等&#xff0c;可以参考H266/VVC编码标准介绍。 官方代码地址&#xff1a; https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM&…

补题与周总结:leetcode第 376 场周赛

文章目录 复盘与一周总结2967. 使数组成为等数数组的最小代价&#xff08;中位数贪心 回文数判断&#xff09;2968. 执行操作使频率分数最大&#xff08;中位数贪心 前缀和 滑窗&#xff09; 复盘与一周总结 wa穿了第3题&#xff0c;赛时其实想到了思路&#xff1a;中位数贪心…

用友U8+CRM help2 任意文件读取漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 help2接口处存在任意文件读取漏洞&#xff0c;攻击者通过漏洞可以获取到服…

acl过滤报文配置(hcia)

放火墙就是这样的 原理 问控制列表ACL&#xff08;Access Control List)是由一条或多条规则组成的集合。所谓规则&#xff0c;是 描述报文匹配条件的判断语句&#xff0c;这些条件可以是报文的源地址、目的地址、端口号等。 ACL本质上是一种报文过滤器&#xff0c;规则是过…

编写一个程序,提示用户输入大写字母,如果输入的不是大写字母,提示用户输入大写字母;如果是大写字母,使用嵌套循环以下面金字塔型的格式打印字母

代码如下: #include<stdio.h> int main(void) { char ch; int i,j; printf("请输入一个大写字母:"); scanf("%c", &ch); i ch - A 1; for (j 1; j < i; j) { //空格的循环 int space; for(spacei-j1; space >1; space--) { pr…

机器学习---随机森林

1、使用决策树来做回归或者预测值 如上图&#xff0c;使用学历、收入、身高、行业使用决策树来预测收到的邮件数。可以将邮件数分为几类&#xff08;也可以按照其他列&#xff0c;将邮件数分类&#xff09;&#xff0c;比如邮件数<23封属于A类&#xff0c;邮件数大于23<邮…

Linux/Windows IP | Team基础管理

引言 IP&#xff08;Internet Protocol&#xff09; 定义&#xff1a; IP&#xff08;Internet Protocol&#xff09;是网络传输数据的协议&#xff0c;负责在网络中唯一标识和定位设备&#xff0c;并提供数据传输的基础。功能&#xff1a; 允许计算机在网络上相互通信和交换…

pycharm下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

算法专题三:二分算法

二分法 零.二分查找1.思路一&#xff1a;朴素二分 一.在排序数组中第一个和最后一个数&#xff1a;1.思路一&#xff1a;GIF题目解析 二.算法X的平方根&#xff1a;1.思路一&#xff1a;暴力哈希2.思路二&#xff1a;二分区间GIF题目解析 三.搜索插入位置&#xff1a;1.思路一&…

Centos 8.5 Oracle12c安装

由于多次安装踩坑&#xff0c;所以本次写了一份12c安装的完整版。可以直接使用。 一、安装数据库基本信息 名称 值 主机名 database 操作系统 CentOS Linux release 8.5.2111 Oracle用户名/密码 oracle Oracle 版本 12c Enterprise Edition Release 12.2.0.1.0 oracle…

Android开发——activity类中的回调方法中的7个生存期

1、onCreate() 这个方法在每个活动中都能进行重写&#xff0c;他会活动在第一次被创建的时候调用。在这个方法中完成活动的初始化操作&#xff0c;如&#xff1a;加载布局、绑定事件等 2、onStart() 这个方法在活动由不可见变为可见的时候调用 3、onResume() 这个方法在活动中准…

扭蛋机小程序搭建,“互联网+”下的发展优势

随着我国生活水平和消费能力不断提高&#xff0c;人们对各种潮流文化类的产品需求也快速上升。至此&#xff0c;我国潮流文化市场得到了快速发展&#xff01; 扭蛋机作为潮玩中的一种商业模式&#xff0c;深受不同年龄层用户的喜爱。并且扭蛋机的种类也是各式各样&#xff0c;…

大数据可视化BI分析工具Apache Superset结合内网穿透实现远程访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

Pooling方法总结(语音识别)

Pooling layer将变长的frame-level features转换为一个定长的向量。 1. Statistics Pooling 链接&#xff1a;http://danielpovey.com/files/2017_interspeech_embeddings.pdf The default pooling method for x-vector is statistics pooling. The statistics pooling laye…

[学习笔记]SQL Server中批量查找所有符合Where条件的记录

目标&#xff1a;在SQL Server中查找所有表的UserId 50的记录 创建一个表变量来存储所有包含’UserId’列的表的名称。然后使用一个游标遍历这些表&#xff0c;并对每个表执行一个动态SQL查询 DECLARE TableName nvarchar(256), ColumnName nvarchar(128), SearchStr2 nvarc…

【笔记】左偏树

左偏树详解 算法进阶课整理CSDN个人主页&#xff1a;更好的阅读体验左偏树功能简介定义与一些性质核心操作&#xff1a;合并算法流程时间复杂度代码 其他的操作插入算法流程时间复杂度 O ( log ⁡ n ) O(\log n) O(logn) 找最值算法流程时间复杂度 O ( 1 ) O(1) O(1) 删除最值…

matlab 最小二乘拟合平面(直接求解法)

目录 一、算法原理二、代码实现三、算法效果本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 平面方程的一般表达式为: A x + B y +

【Linux】whereis命令使用

whereis命令 whereis命令用于查找文件。 使用whereis命令可以查找指定文件、命令和手册页的位置&#xff0c;不能搜索普通文件。 以前学习过 【Linux】 find命令使用 语法 whereis [选项] [文件] find命令 -Linux手册页 命令选项及作用 执行令 whereis --help 执行命…

JDBC常见的几种连接池使用(C3PO、Druid、HikariCP 、DBCP)

✨前言✨ 本篇作为主要在于介绍jdbc数据库连接池&#xff0c;以及多种连接池的用法 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 文章目…

HuggingFace下载模型

目录 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 有些模型的使用方法页面会写git clone的地址&#xff0c;有些没写&#xff0c;直接复制网页地址即可 网页地址&#xff1a; ​https://huggingface.co/…