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

news/2024/10/23 14:33:24/

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> {@Overridepublic 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 {@ZipCodeprivate String zipCode;// 省略 getter 和 setter 方法
}

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

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

@RestController
@RequestMapping("/addresses")
public class AddressController {@PostMappingpublic ResponseEntity<?> createAddress(@Valid @RequestBody Address address) {// 创建地址return ResponseEntity.ok().build();}
}

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

总结

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


http://www.ppmy.cn/news/505728.html

相关文章

【莫比乌斯反演】BZOJ2920-YY的GCD

【题目大意】 给定N, M,求1<x<N, 1<y<M且gcd(x, y)为质数的(x, y)有多少对。 【思路】 太神了这道题……蒟蒻只能放放题解&#xff1a;戳&#xff0c;明早再过来看看还会不会推导过程…… 实用的结论&#xff1a; 嗯…… /***************************************…

2920集五福_支付宝集五福攻略 ▏顺便学点营销活动传播套路

到今天为止&#xff0c;你一共收齐了几张福卡了呢&#xff1f; 本月5号&#xff0c;支付宝在微信公众号里发了《新年俗 集五福》的推文&#xff0c;“2月6日0点&#xff0c;支付宝里见&#xff0c;有你们就有福”。 同时&#xff0c;一名叫“青春、已不在”的网友立马在下方评论…

2920X

演讲不是讲自己的话&#xff0c;而是将听众的话&#xff0c;还记得那些演讲失败者&#xff0c;离开舞台的最后一段话&#xff0c;他们的感言就是我们失败的原因历史总是惊人的相似举例子是为了增加信服性历史是如此的悠久&#xff0c;还有什么故事不能符合我任何贪婪的意愿我的…

java多线程简明笔记(5)线程礼让 yield

关键字&#xff1a;yield 官方文档就不说了&#xff0c;简单理解&#xff0c;礼让 线程礼让 yield正在执行的线程暂停&#xff0c;不阻塞 示例代码&#xff1a; public class ThreadTest7 implements Runnable{public static void main(String[] args) {ThreadTest7 tnew Th…

雅思词汇真经单词共3672个

雅思词汇真经 / Vocabulary for IELTS / 学为贵 赢未来 / 英语真经派学习法 一本书精通雅思词汇 / 刘洪波 编著 / 涵盖&#xff1a;雅思必备核心词汇刘洪波老师原创雅思考点词库 逻辑词群记忆法&#xff0c;一群一群记单词&#xff0c;快速备考无负责 时尚插图&#xff0c;趣味…

大一上:英语复习:Word in use(新视野大学英语读写教程1:第一、三、四、六单元翻译+注释)【四大人工智能翻译辅助系统助力翻译更准确】

文档下载地址&#xff1a;https://pan.baidu.com/s/1qYDT6rU Word in use Unit 1 A 1.Given the chance to show his ability, he regained confidence and began to succeed in school. [自然智力神经系统翻译&#xff08;我翻译的&#xff09;]自从获得了…

智能家庭本周锋闻:小米进军移动医疗

投资九安医疗旗下iHealth智能血压仪&#xff0c;小米为何选择这个时间、进入这个领域&#xff1f;原因大概有这几点&#xff0c;首先可以借助国庆“送礼”时机&#xff1b;其次移动医疗切合小米的年轻用户群体敬老&#xff1b;再者移动医疗前景看好&#xff0c;且可搭配小米手机…

nginx主配置文件及实战案例

文章目录 一.nginx主配置文件nginx.conf1.认识nginx服务的主配置文件2.全局配置3.I/O事件配置4.HTTP配置&#xff15;.检查配置文件是否正确&#xff16;.浏览器测试&#xff17;.总配置文件图示&#xff17;.1 nginx总配置文件的三个模块&#xff17;.2 HTTP文件配置的图示&am…