当前位置: 首页 > article >正文

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的数据验证:使用 Hibernate Validator

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 Spring Boot 里头的数据验证。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。

二、Hibernate Validator 是啥玩意儿?

Hibernate Validator 是 Java Bean Validation(JSR 380)的一个实现,专门用来做数据验证的。Spring Boot 里头默认就集成了这玩意儿,用起来贼方便。

1. 基本用法

Hibernate Validator 提供了一堆注解,用来标注在字段上,比如说 @NotNull、@Size、@Email 啥的。你只要在 Controller 里头用 @Valid 注解标记一下参数,Spring Boot 就会自动帮你验证数据。

Java Code

public class User {

    @NotNull(message = "用户名不能为空")

    private String username;

    @Size(min = 6, max = 20, message = "密码长度必须在 6 到 20 之间")

    private String password;

    @Email(message = "邮箱格式不正确")

    private String email;

    // getters and setters

}

这段代码里头,User 类的字段都用 Hibernate Validator 的注解标注了,@NotNull 表示字段不能为空,@Size 表示字段的长度范围,@Email 表示字段必须是邮箱格式。

2. 在 Controller 中使用

你可以在 Controller 里头用 @Valid 注解标记参数,Spring Boot 会自动验证数据。

Java Code

@RestController

@RequestMapping("/users")

public class UserController {

    @PostMapping

    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {

        return ResponseEntity.ok("用户创建成功");

    }

}

这段代码里头,createUser 方法的 user 参数用 @Valid 注解标记了,Spring Boot 会自动验证 User 对象的字段。

三、自定义验证注解

有时候,Hibernate Validator 自带的注解不够用,你得自己整一个。自定义验证注解很简单,分两步:定义注解实现验证逻辑

1. 定义注解

首先,你得定义一个注解,用 @Constraint 注解指定验证逻辑的实现类。

Java Code

@Target({ ElementType.FIELD })

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = PhoneNumberValidator.class)

public @interface PhoneNumber {

    String message() default "手机号格式不正确";

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

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

}

这段代码里头,@PhoneNumber 是自定义注解,@Constraint 指定了验证逻辑的实现类是 PhoneNumberValidator。

2. 实现验证逻辑

然后,你得实现验证逻辑,继承 ConstraintValidator 接口。

Java Code

public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {

    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3456789]\\d{9}$");

    @Override

    public boolean isValid(String phoneNumber, ConstraintValidatorContext context) {

        if (phoneNumber == null) {

            return true; // 允许为空

        }

        return PHONE_PATTERN.matcher(phoneNumber).matches();

    }

}

这段代码里头,PhoneNumberValidator 实现了 ConstraintValidator 接口,isValid 方法用来验证手机号格式。

3. 使用自定义注解

你可以在实体类里头用自定义注解。

Java Code

public class User {

    @NotNull(message = "用户名不能为空")

    private String username;

    @Size(min = 6, max = 20, message = "密码长度必须在 6 到 20 之间")

    private String password;

    @Email(message = "邮箱格式不正确")

    private String email;

    @PhoneNumber(message = "手机号格式不正确")

    private String phoneNumber;

    // getters and setters

}

这段代码里头,phoneNumber 字段用 @PhoneNumber 注解标记了,Spring Boot 会自动验证手机号格式。

、Spring Boot 里头的验证坑点

1. 验证顺序

Spring Boot 里头,验证顺序很重要。你要是先验证了 @NotNull,那后面的验证就不起作用了。

Java Code

public class User {

    @NotNull(message = "用户名不能为空")

    @Size(min = 6, max = 20, message = "用户名长度必须在 6 到 20 之间")

    private String username;

    // getters and setters

}

这段代码里头,username 字段先用 @NotNull 验证了,再用 @Size 验证。

2. 验证信息的国际化

Spring Boot 里头,验证信息可以国际化。你只要在 messages.properties 文件里头定义验证信息,Spring Boot 就会自动加载。

Properties Code

NotNull.user.username=用户名不能为空

Size.user.username=用户名长度必须在 {min} 到 {max} 之间

这段代码里头,NotNull.user.username 和 Size.user.username 是验证信息的 key,{min} 和 {max} 是占位符。

3. 验证信息的自定义

Spring Boot 里头,验证信息可以自定义。你只要在 ValidationMessages.properties 文件里头定义验证信息,Spring Boot 就会自动加载。

Properties Code

javax.validation.constraints.NotNull.message=字段不能为空

javax.validation.constraints.Size.message=字段长度必须在 {min} 到 {max} 之间

这段代码里头,javax.validation.constraints.NotNull.message 和 javax.validation.constraints.Size.message 是验证信息的 key,{min} 和 {max} 是占位符。

专有名词解释

  1. Hibernate Validator:Java Bean Validation(JSR 380)的一个实现,专门用来做数据验证的。
  2. NotNull:Hibernate Validator 的一个注解,用来验证字段不能为空。
  3. Size:Hibernate Validator 的一个注解,用来验证字段的长度范围。
  4. Email:Hibernate Validator 的一个注解,用来验证字段必须是邮箱格式。
  5. Valid:Spring 的一个注解,用来标记需要验证的参数。
  6. Constraint:Hibernate Validator 的一个注解,用来指定验证逻辑的实现类。
  7. ConstraintValidator:Hibernate Validator 的一个接口,用来实现验证逻辑。
  8. UniqueUsername:自定义注解,用来验证用户名是否已存在。
  9. ValidationMessages.properties:Hibernate Validator 的一个配置文件,用来定义验证信息。

原文地址:https://blog.csdn.net/FoyoDesigner/article/details/146458459
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/597920.html

相关文章:

  • 蓝桥杯备考:动态规划之最长上升子序列打鼹鼠
  • 自动驾驶背后的数学:多模态传感器融合的简单建模
  • python接口自动化pytest+request+allure
  • Python实现deepseek接口的调用
  • C语言入门教程100讲(13)其他运算符
  • 2025年了,5G还有三个新变化
  • QEMU 引导时分离内核和文件系统
  • Shell中sed的用法
  • 安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查
  • 基于TCN-BiLSTM-Attention的序列数据预测(功率预测、故障诊断)模型及代码详解
  • 常⻅中间件漏洞--Tomcat
  • bootstrap 表格插件bootstrap table 的使用经验谈!
  • Rocky Linux 软件安装:Last metadata expiration check:
  • 某视频的解密下载
  • 潮流霓虹酸性渐变液体流体扭曲颗粒边缘模糊JPG背景图片设计素材 Organic Textures Gradients Collection
  • 1. 找不能被3、5和7整除的数并存入列表。
  • 深入理解Linux中的SCP命令:使用与原理
  • centos 7 部署ftp 基于匿名用户
  • Android 图片加载框架:Picasso vs Glide
  • LeetCode Hot 100 - 子串 | 560.和为K的子数组、239.滑动窗口最大值、76.最小覆盖子串