springboot参数校验

springboot参数传递
  • @PathVariable
  • @RequestParam
  • @RequestBody
JSR303

jsr303 : 也称 bean validation 规范,用于java bean 验证的标准API,,他定义了一组注解,可以在javabean 的属性上声明验证规则

JSR: java specification request

常用注解:

  • @NotNull
  • @Size : 定义属性的最小和最大长度
  • @Min
  • @Max
  • @Pattern : 属性值必须匹配正则
  • @Email
  • @Valid : 对嵌套对象或者集合触发验证
    在这里插入图片描述

在这里插入图片描述

springboot中校验注解

在类上打上 @Validated 才会开启校验
在这里插入图片描述
在这里插入图片描述
校验javabean 也要设置 @Validated ,,javabean中的每一个字段,也需要验证,,字段可能是一个普通字段,也可能是对象,,如果是对象,,使用@Valid 对嵌套对象触发验证

@Valid@Validated 区别: 这两个都可以对javabean 开启验证,,@Valid是java提供的,,@Validated 是spring 对@Valid的扩展,,一般开启验证使用 @Validated,指定嵌套验证使用@Valid

自定义校验注解

自定义一个注解,校验两次输入密码一样:

  • 这个注解需要遵循一定的规范,他有两个模板方法,必须要有
@Documented // 注解里面的注释加入到文档@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})
@Constraint(validatedBy = PasswordValidator.class)  // 指定多个校验类
public @interface PasswordEquals {int min() default 3;int max() default 6;String message() default "password not equal";/***  如果要自定义校验  有两个模板方法,必须加上,,规范必须要有这两个东西*/Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
  • 写你自己的验证逻辑,实现ConstraintValidator接口,,这个接口第一个泛型是:你自定义的注解,, 第二个泛型是: 自定义注解要打在什么类型的数据上,,如果打在类上,就是类的类型,如果打在字段上,就是字段的类型
    这里面可以获取注解传入的值,,和javabean传入的值,,在isValid方法中进行比较,返回true,则验证通过
/*** 泛型:*      <自定义注解的类型,自定义注解修饰的目标的类型>***     如果注解在类上,,修饰的是类*     如果注解在字段上,,修饰的是字段 ,,就是字段的类型*/
public class PasswordValidator implements ConstraintValidator<PasswordEquals, PersonDTO> {private int min;private int max;/*** 校验通过 返回true,不通过返回false*/@Overridepublic boolean isValid(PersonDTO personDTO, ConstraintValidatorContext context) {// 没有考虑密码为空String password01 = personDTO.getPassword01();String password02 = personDTO.getPassword02();return password01.equals(password02);}/*** 获取注解传入的值*/@Overridepublic void initialize(PasswordEquals constraintAnnotation) {this.min = constraintAnnotation.min();this.max = constraintAnnotation.max();ConstraintValidator.super.initialize(constraintAnnotation);}
}
  • 将自定义的 ContraintValidator 绑定到指定注解上
    一个注解可以绑定多个 ConstraintValidator 指定多个校验类
    在这里插入图片描述

根据不同的判断,设置不同的错误信息:

public class PasswordEqualValidator implements ConstraintValidator<PasswordEqual, Person> {private Integer min;private Integer max;@Overridepublic void initialize(PasswordEqual constraintAnnotation) {this.max = constraintAnnotation.max();this.min = constraintAnnotation.min();}@Overridepublic boolean isValid(Person person, ConstraintValidatorContext context) {String password01 = person.getPassword01();String password02 = person.getPassword02();if (password01.length() < min){context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate("长度不能小于3").addConstraintViolation();return  false;}return password01.equals(password02);}
}
参数校验的异常
  • ConstraintViolationException
    路径中传递参数报错 ,比如 @PathVarible ,,@RequestParam 传递的路径参数和query参数报错
    这个异常: 系统会自动拼接这些参数的错误,,在异常的message中返回
 @ExceptionHandler(ConstraintViolationException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public UnifyResponse handleConstraintViolationException(HttpServletRequest request,ConstraintViolationException e){System.out.println("e = " + e);// 所有的验证Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();// 在 异常的 message 中拼接好了,,如果是在自定义异常要定制化显示,,就需要遍历 ConstraintViolation自己拼接return new UnifyResponse(10001, e.getMessage(), request.getMethod() + " " + request.getRequestURI());}
  • MethodArgumentNotValidException
    在对javabean验证的时候报错,,,多个校验器没有通过会返回一个集合,,需要自己拼接错误信息,所有异常都要处理,,不能只处理一个
 @ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(HttpStatus.BAD_REQUEST) // 400 参数错误public UnifyResponse handleBeanValidation(HttpServletRequest request,MethodArgumentNotValidException e){String uri = request.getRequestURI();String method = request.getMethod();// 多个校验器都没有通过,,返回集合List<ObjectError> allErrors = e.getBindingResult().getAllErrors();Optional<String> errorMsg = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).reduce((a, b) -> (a + "," + b ));System.out.println("errormsg = " + errorMsg);return new UnifyResponse(10001, errorMsg.orElse(""), method + "  " + uri);}

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

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

相关文章

【Android安全】Embedded Trace Microcell模块

ETM: Embedded Trace Macrocell, hardware unit responsible to generate hardware instruction trace. ETM模块用于在硬件层面实现instruction trace&#xff0c;可用于辅助逆向分析。 使用教程&#xff1a; https://mcuoneclipse.com/2016/11/05/tutorial-getting-etm-inst…

鸿鹄协助管理华为云与炎凰Ichiban

炎凰对华为云的需求 在炎凰日常的开发中&#xff0c;对于服务器上的需求&#xff0c;我们基本都是采用云服务。目前我们主要选择的是华为云&#xff0c;华为云的云主机比较稳定&#xff0c;提供的云主机配置也比较多样&#xff0c;非常适合对于不同场景硬件配置的需求&#xff…

Java IO,BIO、NIO、AIO

操作系统中的 I/O 以上是 Java 对操作系统的各种 IO 模型的封装&#xff0c;【文件的输入、输出】在文件处理时&#xff0c;其实依赖操作系统层面的 IO 操作实现的。【把磁盘的数据读到内存种】操作系统中的 IO 有 5 种&#xff1a; 阻塞、 非阻塞、【轮询】 异步、 IO复…

NLP From Scratch: 生成名称与字符级RNN

NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在<cite>第一个教程< / intermediate / char_rnn_classification_tutorial ></cite> 中&#xff0c;我们使用了 RNN 将名称分类为来源语言。 这次&#xff…

Java泛型

文章目录 1. 泛型入门1.1 定义简单泛型类1.2 泛型方法1.3 限定类型变量 2. 擦除和转换2.1 类型擦除 3. 类型通配符3.1 通配符上限3.2 通配符下限3.3 例子 4. java的Type4.1 UML总览 1. 泛型入门 泛型的英文名Generic&#xff0c;java5以后&#xff0c;引入参数化类型&#xff…

原型模式——对象的克隆

1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 在使用原型模式时&#xff0c;需要首先创建一个原型对象&#xff0c;再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式&#xff08;Prototype Patt…

14.python设计模式【模板方法模式】

内容&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色&#xff1a; 抽象类&#xff08;AbstractClass&#xff09;&#xff1a;定义抽象的原子操作&#xff08;钩子…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v9.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、标准Java平台&#xff0c;服务端基于Netty编写。 工程开源地址是&am…

HTML5前端开发工程师的岗位职责说明(合集)

HTML5前端开发工程师的岗位职责说明1 职责 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5相关技术开发移动平台的web前端页面; 2、基于HTML5.0标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、持续的优化前端体验和页面响应速度&#xff0c;并保证兼容性和…

【论文阅读】Feature Inference Attack on Shapley Values

摘要 研究背景 近年来&#xff0c;解释性机器学习逐渐成为一个热门的研究领域。解释性机器学习可以帮助我们理解机器学习模型是如何进行预测的&#xff0c;它可以提高模型的可信度和可解释性。Shapley值是一种解释机器学习模型预测结果的方法&#xff0c;它可以计算每个特征对…

了解Unity编辑器之组件篇Scripts(六)

Scripts&#xff1a;有Unity提供的一些脚本插件&#xff08;自己新建的脚本也会出现在里面&#xff09; 一、TMPro&#xff1a;有一些与文字显示和排版相关的脚本 1.TextContainer&#xff08;文本容器&#xff09;&#xff1a;TextContainer 是一个内容框&#xff0c;用于定…

AIGC人工智能辅助开发:提升效率、优化代码、实现智能编程

文章目录 1. 什么是AIGC人工智能辅助开发&#xff1f;2. AIGC的优势和应用场景2.1 提升开发效率2.2 优化代码质量2.3 实现智能编程 3. 如何用好AIGC人工智能辅助开发&#xff1f;3.1 选择合适的AIGC工具3.2 理解AIGC的工作原理3.3 逐步应用AIGC辅助开发3.4 主动参与AIGC的学习和…

AI工程师的崛起:填补AI革命中的空白

在一个拥有大约5000名语言学习模型&#xff08;LLM&#xff09;研究员&#xff0c;但大约有5000万软件工程师的世界中&#xff0c;供应限制决定了一种新型专业人才—AI工程师的迅猛增长。他们的崛起不仅仅是一种预测&#xff0c;更是对科技世界动态变化的必然反应。AI工程师作为…

【Linux】-进程概念及初始fork

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0

&#x1f989; AI新闻 &#x1f680; Stability AI推出最先进的AI工具Stable Diffusion XL 1.0 摘要&#xff1a;Stability AI宣布推出Stable Diffusion XL 1.0&#xff0c;该版本是其迄今为止最先进的AI工具。Stable Diffusion XL 1.0提供更鲜艳、更准确的图片生成&#xff…

Python开发之手动实现一维线性插值

Python开发之手动实现一维线性插值 1.线性插值法介绍2.手动实现线性插值3.案例一&#xff1a;手动实现线性插值4.使用pandas的插值方法实现要求(推荐)5.案例二&#xff1a;对一组数据进行线性插值和SG滤波处理 前言&#xff1a;主要介绍手动实现一维线性插值以及pandas里面的in…

flink采用thrift读取tablets一个天坑

原先的配置 [INFO] StarRocksSourceBeReader [open Scan params.mem_limit 8589934592 B] [INFO] StarRocksSourceBeReader [open Scan params.query-timeout-s 600 s] [INFO] StarRocksSourceBeReader [open Scan params.keep-alive-min 100 min] [INFO] StarRocksSourceBeRea…

ORCA优化器浅析——QueryToDXL(CDXLLogical+CDXLScalar)主流程

Orca是Pivotal数据管理产品的新查询优化器&#xff0c;包括GPDB和HAWQ。Orca是一个基于Cascades操作时序框架的现代自上而下的查询优化器。虽然许多Cascades优化器与其主机系统紧密耦合&#xff0c;但Orca的一个独特功能是它能够作为独立的优化器在数据库系统之外运行。这种能力…

51:电机(ULN2003D)

1:介绍 我们51单片机使用的是直流电机 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转…

flutter:角标

角标应该非常常见了&#xff0c;以小说app为例&#xff0c;通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API&#xff0c;使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…