📅  最后修改于: 2023-12-03 15:05:16.515000             🧑  作者: Mango
在 Web 开发中,常常需要对用户输入的数据进行验证,确保其符合要求并且安全可靠。Spring 提供了丰富的数据验证机制,其中最常用的就是基于注解的数据验证,Spring 还支持自定义数据验证。
Spring 的 @Valid
注解可以用来验证对象的属性值。在 Controller 中,当请求参数使用 @RequestBody
或 @ModelAttribute
注解时,可以在该对象上使用 @Valid
注解来进行验证。例如:
@PostMapping("/user")
public String addUser(@RequestBody @Valid User user) {
//用户数据合法,进行保存
userRepository.save(user);
return "redirect:/users";
}
这里的 User
对象上使用了 @Valid
注解,表示要对 User
对象的属性进行验证。如果验证失败,会自动返回错误信息。在 User
对象的属性上,可以使用 Spring 自带的数据验证注解,例如:
@NotNull
:验证不为 null
@NotEmpty
:验证不为 null
或空字符串@NotBlank
:验证不为 null
、空字符串或只包含空格@Min
:验证数值大于等于指定值@Max
:验证数值小于等于指定值@Email
:验证是一个合法的邮箱格式例如:
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@NotEmpty(message = "密码不能为空")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
//省略get/set方法
}
除了使用自带的数据验证注解之外,我们还可以自定义数据验证注解,来验证一些特殊的条件和场景。
自定义数据验证注解需要实现 javax.validation.ConstraintValidator
接口。例如,我们想要验证一个字符串的长度是否大于等于指定值,可以创建一个 @MinLength
注解:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MinLengthValidator.class)
public @interface MinLength {
int value();
String message() default "长度不能小于{value}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
这里的 @Target
和 @Retention
注解用来定义注解的使用范围和生命周期。@Constraint
注解用来指定该注解要使用的验证器类,即 MinLengthValidator
类。
public class MinLengthValidator implements ConstraintValidator<MinLength, String> {
private int value;
@Override
public void initialize(MinLength annotation) {
this.value = annotation.value();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.length() >= this.value;
}
}
在自定义的验证器类中,需要实现 initialize
和 isValid
方法。initialize
方法用来初始化注解参数,isValid
方法用来验证数据是否合法。
然后,就可以在 User
类中使用 @MinLength
注解了:
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@NotEmpty(message = "密码不能为空")
@MinLength(value = 6, message = "密码长度不能小于6")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
//省略get/set方法
}
这样,就可以通过自定义注解来验证数据了。
Spring 提供了丰富的数据验证机制,其中基于注解的数据验证机制应用最广泛。在使用时,可以根据需求选择合适的数据验证注解,如果没有合适的注解,还可以自定义数据验证注解。通过使用数据验证注解,可以有效地防止恶意用户提交不合法数据,提高网站的安全性和用户体验。