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

【 <二> 丹方改良: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 的一个配置文件,用来定义验证信息。

相关文章:

  • 数据建模流程: 概念模型>>逻辑模型>>物理模型
  • NSSCTF(MISC)——[NSSRound#4 SWPU]Type Message
  • 网络爬虫-2:基础与理论
  • 论文阅读笔记:Denoising Diffusion Probabilistic Models (3)
  • C语言中*a与a的区别和联系
  • 数据结构——B树、B+树、哈夫曼树
  • 安全测试理论
  • JavaScript 性能优化实战
  • 【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等
  • 【C++教程】setw()函数的使用方法
  • 深入理解Linux中的SCP命令:使用与原理
  • Hutool中的相关类型转换
  • 山东大学数据结构课程设计
  • linux--时区查看和修改
  • 动态规划-01背包
  • 牛客网【模板】二维差分(详解)c++
  • 分区表的应用场景与优化实践
  • 001-JMeter的安装与配置
  • 【操作系统笔记】操作系统的功能
  • 【Linux】线程库
  • 五一假期如何躺赚利息?来看国债逆回购操作攻略
  • 初步结果显示,卡尼领导的加拿大自由党在联邦众议院选举中获胜
  • 国务院任免国家工作人员:饶权任国家文物局局长
  • 因高颜值走红的女通缉犯出狱后当主播自称“改邪归正”,账号已被封
  • 阿曼外交大臣:伊美下一轮谈判暂定5月3日举行
  • 中方在IMF发声:美滥施关税威胁全球金融稳定,对新兴市场和发展中国家构成严峻挑战