spring boot项目如何自定义参数校验规则

spring boot项目对参数进行校验时,比如非空校验,可以直接用validation包里面自带的注解。但是对于一些复杂的参数校验,自带的校验规则无法满足要求,此时需要我们自定义参数校验规则。自定义校验规则和自带的规则实现方式一样,先自定义一个注解,然后指定校验类,在校验类里实现具体的校验规则。

下面以校验手机号为例,来实现自定义参数校验规则。

首先定义一个注解,直接照着NotNull注解定义即可。

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//这里的class就是实现具体校验规则的类
@Constraint(validatedBy = {MobileNoValidator.class})
public @interface MobileNo {String message() default "请输入正确的手机号";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}

然后定义实现具体校验规则的类,这个类要实现ConstraintValidator接口。

public class MobileNoValidator implements ConstraintValidator<MobileNo, String> {@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if ((value == null)) {return false;}String regex = "^1\\d{10}$";Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(value);return m.matches();}
}

这样,很简单的两个类,就实现了自定义参数校验规则。当参数中加了MobileNo注解,如果输入的手机号不满足1打头的11位数字的规则,就会抛出异常信息。下面写个controller简单测试一下。

先定义一个vo。

public class UserVo {@NotNullprivate Long id;@NotNull@MobileNoprivate String mobileNo;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getMobileNo() {return mobileNo;}public void setMobileNo(String mobileNo) {this.mobileNo = mobileNo;}
}

再定一个controller。

@RestController
public class UserController {@PostMapping(value = "/test")public String test(@Validated @RequestBody UserVo userVo) {return "success";}
}

启动项目,用postman测试一下。

首先输入符合要求的手机号,这时是能正常返回success。

然后输入一个不符合要求的手机号,会返回400错误码,错误信息如下。当然这里返回的错误信息比较不友好,实际项目中可以对参数校验异常统一拦截,返回需要的数据格式。

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

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

相关文章

基于单片机的电子密码锁设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的电子密码锁&#xff0c;可设置四位密码&#xff0c;输入错误三次&#xff0c;报警灯亮起&#xff08;红灯亮起&#xff09;&#xff0c;输入正确&#xff0c;绿灯闪烁三次。可通过LCD显示屏查看密码&…

IT外包对中小企业的独特优势

在竞争激烈的商业环境中&#xff0c;企业的发展稍有缓慢&#xff0c;就很有可能被竞争对手快速赶超、趁机抢占市场。一些中小企业为了更好地应对市场变化和提高自身竞争力&#xff0c;越来越多地转向了IT外包服务。相较于大型企业&#xff0c;中小企业在选择IT外包时能够获得一…

shell命令学习(1)——(待完善)

explainshell.com shell统计当前文件夹下的文件个数、目录个数Linux之shell常用命令&#xff08;三&#xff09; sort&#xff08;排序&#xff09;、uniq&#xff08;处理重复字符&#xff09; linux中shell将换行输入到文件中 shell脚本&#xff0c;将多行内容写入文件中 f…

项目设计---消息驿站

文章目录 一. 项目描述二. 核心技术三. 需求分析概要设计四. 详细设计4.1 服务器模块4.1.1 内存管理4.1.2 硬盘管理4.1.2.1 数据库管理4.1.2.2 文件管理 4.1.3 消息转发 4.2 客户端模块4.2.1 连接管理4.2.2 信道管理 4.3 公共模块4.3.1 通信协议4.3.2 序列化/反序列化 一. 项目…

netty07-粘包半包以及解决方案

粘包指的是发送方在发送数据时&#xff0c;多个数据包被合并成一个大的数据包发送到接收方&#xff0c;接收方在接收时无法准确地区分各个数据包的边界&#xff0c;从而导致数据粘在一起。 半包指的是发送方发送的数据包被拆分成了多个小的数据包&#xff0c;在接收方接收时&a…

简单实现Spring容器(一)

阶段1: 编写自己的Spring容器,实现扫描包,得到bean的class对象.思路: 使用 ElfSpringConfig.java 替代beans.xml文件作为配置文件,从中获取到: 1.扫描包,得到bean的class对象. 2.排除包下不是bean的 1.容器文件 ElfSpringApplicationContext.java 核心!!! package com.elf…

05、pytest断言确定的异常

官方用例 # content of test_sysexit.py import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()解读与实操 ​ 标准python raise函数可产生异常。pytest.raises可以断言某个异常会发现。异常发生了&#xff0c;用例执行成功&#x…

AntDesignBlazor示例——创建查询条件

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/AntDesignDemo 1. 学习目标 重构项目文件结构添加日期查询条件实现查询业务逻辑 2. 重构项目结构 在实现列表查询条件功…

静态住宅代理科普——实际应用场景以及如何配置?

住宅代理IP不仅是理论上的网络工具&#xff0c;它在多个实际应用场景中表现突出&#xff0c;极大地便利了用户的网络操作。接下来&#xff0c;将深入探讨住宅代理IP在市场调研、内容访问、社交媒体管理等方面的实际应用&#xff0c;揭示其在不同领域的实用价值。 ## 实际应用场…

CSS新手入门笔记整理:CSS溢出声名overflow

通常一个盒子的内容是被限制在盒子边框之内的&#xff0c;但是有时也会溢出&#xff0c;即部 分或者全部内容跑到盒子边框之外。 语法 元素{overflow:取值&#xff1b;} 属性值 说明 visible 若内容溢出&#xff0c;则溢出内容可见&#xff08;默认值&#xff09; hid…

Numpy数组的创建(第一讲)

Numpy数组的创建 &#xff08;第1讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f…

【hacker送书第10期】AI时代系列丛书(五选一)

AI时代系列丛书 AI时代程序员开发之道✨内容简介参与方式 AI时代项目经理成长之道✨内容简介参与方式 AI时代架构师修炼之道✨内容简介参与方式 AI时代产品经理升级之道✨内容简介参与方式 AI时代Python量化交易实战✨内容简介参与方式 AI时代程序员开发之道✨ 内容简介 本书是…