【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的数据验证:使用 Hibernate Validator
<前文回顾>
<今日更新>
一、开篇整活儿
今儿个咱唠唠 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} 是占位符。
专有名词解释
- Hibernate Validator:Java Bean Validation(JSR 380)的一个实现,专门用来做数据验证的。
- NotNull:Hibernate Validator 的一个注解,用来验证字段不能为空。
- Size:Hibernate Validator 的一个注解,用来验证字段的长度范围。
- Email:Hibernate Validator 的一个注解,用来验证字段必须是邮箱格式。
- Valid:Spring 的一个注解,用来标记需要验证的参数。
- Constraint:Hibernate Validator 的一个注解,用来指定验证逻辑的实现类。
- ConstraintValidator:Hibernate Validator 的一个接口,用来实现验证逻辑。
- UniqueUsername:自定义注解,用来验证用户名是否已存在。
- ValidationMessages.properties:Hibernate Validator 的一个配置文件,用来定义验证信息。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/597920.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!