Spring Boot 中自定义数据校验注解

news2024/11/17 16:04:50

Spring Boot 中自定义数据校验注解

在 Spring Boot 中,我们可以使用 JSR-303 数据校验规范来校验表单数据的合法性。JSR-303 提供了一些常用的数据校验注解,例如 @NotNull@NotBlank@Size 等。但是,在实际开发中,我们可能需要自定义数据校验注解来满足特定的需求。本文将介绍如何在 Spring Boot 中自定义数据校验注解,并提供示例代码来演示它的用法。

在这里插入图片描述

自定义校验注解

在 Spring Boot 中,我们可以通过定义注解并使用 @Constraint 注解来自定义数据校验注解。下面是一个自定义的注解 @ZipCode,用于校验邮政编码是否合法:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ZipCodeValidator.class)
public @interface ZipCode {

    String message() default "Invalid zip code";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @interface List {
        ZipCode[] value();
    }
}

在上面的代码中,我们使用了 @Constraint 注解来指示该注解需要使用 ZipCodeValidator 类进行校验。@Constraint 注解中的参数含义如下:

  • validatedBy:指示使用哪个类进行校验。
  • message:校验失败时返回的消息。
  • groups:校验分组。
  • payload:校验负载。

在注解中,我们定义了一个 ZipCodeValidator.List 内部注解,用于支持多个 @ZipCode 注解的使用。

自定义校验器

在自定义校验注解后,我们还需要实现校验器。下面是一个 ZipCodeValidator 校验器的示例代码:

public class ZipCodeValidator implements ConstraintValidator<ZipCode, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        Pattern pattern = Pattern.compile("\\d{5}");
        Matcher matcher = pattern.matcher(value);
        return matcher.matches();
    }
}

在上面的代码中,我们实现了 ConstraintValidator<ZipCode, String> 接口,并重写了 isValid 方法。isValid 方法用于实际校验逻辑。在本例中,我们使用正则表达式验证邮政编码是否符合 5 位数字的格式。

使用自定义校验注解

在定义自定义校验注解和校验器后,我们可以在 Java 对象中使用自定义校验注解。下面是一个示例代码:

public class Address {

    @ZipCode
    private String zipCode;

    // 省略 getter 和 setter 方法
}

在上面的代码中,我们在 Address 类的 zipCode 属性上使用了 @ZipCode 注解。在使用时,我们不需要指定 message 参数,因为该参数已经在 @ZipCode 注解中指定。

在控制器中,我们可以使用 @Valid 注解来指示需要校验的对象。例如:

@RestController
@RequestMapping("/addresses")
public class AddressController {

    @PostMapping
    public ResponseEntity<?> createAddress(@Valid @RequestBody Address address) {
        // 创建地址
        return ResponseEntity.ok().build();
    }
}

在上面的示例代码中,我们使用了 @Valid 注解来指示需要校验 RequestBody 中的 Address 对象。如果校验失败,Spring Boot 将自动返回一个包含错误信息的响应。

总结

在本文中,我们介绍了在 Spring Boot 中自定义数据校验注解的方法,并提供了示例代码来演示它的用法。使用自定义校验注解可以帮助我们满足特定的数据校验需求,从而提高 Web 应用的安全性和可靠性。如果您在开发 Web 应用程序时需要进行数据校验,并且默认的数据校验注解无法满足您的需求,请务必考虑使用自定义校验注解的方法。

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

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

相关文章

2023年6月24日(星期六):骑行明郎

2023年6月24日(星期六)&#xff1a;骑行明郎&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30点准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点: 大观公园门囗集合&#xff0c;家住南&#xff0c;东&#xff0c…

(二叉树) 100. 相同的树 ——【Leetcode每日一题】

❓100. 相同的树 难度&#xff1a;简单 给你两棵二叉树的根节点 p 和 q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q …

使用代理ip做网页抓取需要注意什么

现在&#xff0c;很多公司为达成目标&#xff0c;都需要抓取大量数据。企业需要根据数据来作出重大决定&#xff0c;因此掌握准确信息至关重要。互联网上有许多宝贵的公共数据。问题是如何轻松采集这些数据&#xff0c;而无需让团队整天手动复制粘贴所需信息?网页抓取的定义越…

Qt学习11:Dialog对话框操作总结

文章目录 QDialogQDialogButtonBoxQMessageBoxQFileDialogQFontDialogQColorDialogQInputDialogQProgressDialog 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 QDialog Qt中使用QDialog来实现对话框&#xff0c;QDialog继承自QWidget&#xff0c;对话框分为**三种**&…

尿的唰唰和笑的哈哈

很多人说看不懂&#xff0c;不知道哪个是真哪个是假。我说都是真的。不同心不同理。全球并不同炎凉。窦唯有句歌词&#xff1a;天堂地狱皆在人间。何勇有句歌词&#xff1a;有人减肥&#xff0c;有人饿死没粮。&#xff08;1&#xff09;产业我过去说过顶天立地。立地&#xff…

专利背后的故事 | 一种异常信息检测方法和装置

Part01 专利发明的初衷 用户和实体行为分析&#xff08;UEBA&#xff09;在2018年入选Gartner为安全团队建议的十大新项目。UEBA近几年一直受到国内安全厂商的热捧。但是对于UEBA的理解&#xff0c;以及具体落实的产品方案&#xff0c;各厂商虽然明显不同&#xff0c;但在对账…

Go应用性能优化的8个最佳实践,快速提升资源利用效率!

作者&#xff5c;Ifedayo Adesiyan 翻译&#xff5c;Seal软件 链接&#xff5c;https://earthly.dev/blog/optimize-golang-for-kubernetes/ 优化服务器负载对于确保运行在 Kubernetes 上的 Golang 应用程序的高性能和可扩展性至关重要。随着企业越来越多地采用容器化的方式和 …

HOOPS Native Platform 2023 cRACK

将高级 3D 工作流程添加到桌面和移动应用程序 HOOPS 原生平台集成了三种用于桌面和移动应用程序开发的先进 HOOPS 技术&#xff0c;包括高性能图形 SDK、CAD 数据访问工具包和 3D 数据发布 API。 ​ ​ 构建 3D 原生应用 借助桌面和移动设备上的 HOOPS 原生平台&#xff0c;快…

一个初级程序员该在哪接项目练手?

作为一个初级程序员&#xff0c;想要通过兼职接单赚钱&#xff0c;离不开项目练手。但不得不说&#xff0c;初级程序员想要通过接私活获取收入还是相对比较困难的&#xff0c;如果对接私活比较感兴趣的朋友&#xff0c;可以参考这条路径&#xff1a; 在GitHub上学习大佬的项目…

【WebLogic】WebLogic 10.3.6.0部署应用包后报错

问题背景&#xff1a; WebLogic 10.3.6.0部署应用包后出现报错【posted content exceeds max post size】&#xff0c;此报错会导致应用部署的目标服务实例无法成功启动。 报错信息截图如下所示&#xff1a; 根据报错信息&#xff0c;查询相关MOS文档&#xff0c;发现问题原因是…

网络能成为AI加速器吗

网络能成为AI加速器吗 摘要 人工神经网络&#xff08;NNs&#xff09;在许多服务和应用中扮演越来越重要的角色&#xff0c;并对计算基础设施的工作负载做出了重要贡献。在用于延迟敏感的服务时&#xff0c;NNs通常由CPU处理&#xff0c;因为使用外部专用硬件加速器会效率低下…

Magisk hide/Denylist 核心原理分析 ROOT隐藏的实现浅论

前言 当手机安装magisk后&#xff0c;全局的挂载空间会受到变更&#xff0c;magisk给我们挂载上了一个su二进制&#xff0c;这就是我们能够访问到su命令的原因 无论是Magisk hide还是Denylist&#xff0c;我们都可以将它们的工作分成两个部分&#xff0c;第一个部分是如何监控…

vue2中引入天地图及相关配置

前言 项目中需要引入特殊用途的地图&#xff0c;发现天地图比高德地图、百度地图要更符合需求&#xff0c;于是看了看天地图。 正文 vue2项目中如何引入天地图并对相关的配置进行修改使用呢&#xff1f;官方给的4.0版本的使用说明。 引入&#xff1a; 进入到public/index.html中…

使用逻辑回归LogisticRegression来对我们自己的数据excel或者csv数据进行分类--------python程序代码,可直接运行

文章目录 一、逻辑回归LogisticRegression是什么&#xff1f;二、逻辑回归LogisticRegression进行分类的具体步骤二、逻辑回归LogisticRegression进行二分类的详细代码三、逻辑回归LogisticRegression的广泛用途总结 一、逻辑回归LogisticRegression是什么&#xff1f; 逻辑回…

小白白也能学会的 PyQt 教程 —— QRadioButton 介绍以及基本使用

文章目录 一、QRadioButton快速入门1. QRadioButton简介2. QRadioButton快速上手 二、响应单选按钮点击事件1、信号和槽机制&#xff1a;2、创建槽函数来响应单选按钮点击&#xff1a;3、示例&#xff1a;执行特定操作或显示相关内容&#xff1a; 三、单选按钮的常用功能和属性…

三维形体投影面积

&#x1f388; 算法并不一定都是很难的题目&#xff0c;也有很多只是一些代码技巧&#xff0c;多进行一些算法题目的练习&#xff0c;可以帮助我们开阔解题思路&#xff0c;提升我们的逻辑思维能力&#xff0c;也可以将一些算法思维结合到业务代码的编写思考中。简而言之&#…

petalinux 生成SDK报错排除

AAA: 在项目文件下新建Qt5文件夹文件夹内新建文件并且设置对应参数 文件夹路径&#xff1a; project-spec/meta-user/recipes-qt/qt5 新建文件 vim ./qt5/qt3d_%.bbappend vim ./qt5/qtquickcontrols2_%.bbappend vim ./qt5/qtserialbus_%.bbappend 文件内容 qt3d_%.bbap…

完美解决Non-terminating decimal expansion; no exact representable decimal result.异常

我们在使用BigDecimal进行精确计算时常常会出现Non-terminating decimal expansion; no exact representable decimal result.异常。 出现这个异常的原因在于 BigDecimal 是不可变的、任意精度的有符号十进制数&#xff0c;所以可以做精确计算。但在除法中&#xff0c;准确的商…

ernie-layout笔记

1: 识别文档中文字以及准确的对这些文字排序是必须的一步骤 采用 OCR技术识别文字以及对应的图像坐标信息&#xff0c;光栅扫描以生成输入序列按照从左到右&#xff0c;从上到下的顺序&#xff1b;但是以上方法针对复杂的结构就会出现问题&#xff1b;因此文章使用了Document-P…

Spring源码核心剖析 | 京东云技术团队

前言 SpringAOP作为Spring最核心的能力之一&#xff0c;其重要性不言而喻。然后需要知道的是AOP并不只是Spring特有的功能&#xff0c;而是一种思想&#xff0c;一种通用的功能。而SpringAOP只是在AOP的基础上将能力集成到SpringIOC中&#xff0c;使其作为bean的一种&#xff…