根据您的需求,我会详细讲解 SpringBoot 如何自定义请求参数校验的完整攻略。
1. 简介
SpringBoot默认使用 Hibernate Validator 作为参数校验的实现库(底层实现其实是 JSR-303 Bean Validation 规范)。在进行参数校验时,我们通常会使用一组预定义好的注解,如:@NotNull、@Min、@Max、@Size、@DecimalMin、@DecimalMax 等来辅助完成校验。但是有一些场景,我们需要将检验规则进行个性化的配置,比如配置字段校验规则、自定义校验注解等。
2. 前置条件
在开始本文,需要先确保您已经具备以下条件:
- JDK 8 或更高版本
- SpringBoot 2.x 或更高版本
3. 自定义参数校验器
3.1 实现 ConstraintValidator 接口
自定义参数校验器,需要实现 ConstraintValidator 接口。ConstraintValidator 是一个泛型接口,提供了两个泛型参数,分别代表:
- 注解类型,也就是我们自定义的参数校验注解(比如:@Phone)
- 被校验的属性类型(比如:String)
public class PhoneValidator implements ConstraintValidator<Phone, String> {
private static final String PHONE_PATTERN = "^1([34578])\\d{9}$";
private static final Pattern pattern = Pattern.compile(PHONE_PATTERN);
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.isEmpty(value)) {
return true;
}
Matcher matcher = pattern.matcher(value);
return matcher.matches();
}
@Override
public void initialize(Phone constraintAnnotation) {
// 针对注解进行初始化
}
}
以上示例中,我们使用了正则表达式匹配手机号。注解 @Phone 的定义如下:
/**
* 手机号校验注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
String message() default "手机号格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
完成自定义参数校验器和注解的定义后,我们就可以将其应用到 SpringMvc 中了。
3.2 应用到 SpringMvc
使用自定义校验注解时,我们需要在使用参数校验注解的 Controller 方法参数前加上注解 @Valid。同时,在要求校验的参数上,需要加上具体的校验注解,如:@NotNull、@NotBlank、@Size、@Phone 等。这样,在接口调用时,Spring 会对参数进行校验。
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@RequestBody @Valid User user) {
return "createUser";
}
}
以上示例中,我们使用 @Phone 校验了用户注册时填写的手机号码。假设用户提供了一个非法的手机号码,接口在执行时会返回以下错误信息:
{
"timestamp": "2021-01-01T00:00:00.000+0000",
"status": 400,
"error": "Bad Request",
"message": "Invalid Parameter",
"path": "/users",
"errors": [
{
"field": "phone",
"message": "手机号格式不正确"
}
]
}
4. 示例代码
下面是一个简单的示例程序,您可以参考其中的代码实现自定义参数校验注解。
/**
* @Author: GXBB
* @Date: 2021/1/1 14:18
* @Version: 1.0
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping
public String createUser(@RequestBody @Valid User user) {
return "createUser";
}
}
/**
* 用户实体类
*/
public static class User {
@NotBlank(message = "姓名不能为空")
private String userName;
@Phone(message = "手机格式不正确")
private String phone;
// 省略 getter/setter 方法
}
/**
* 手机号校验注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
String message() default "手机号格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
/**
* 手机号校验器
*/
public static class PhoneValidator implements ConstraintValidator<Phone, String> {
private static final String PHONE_PATTERN = "^1([34578])\\d{9}$";
private static final Pattern pattern = Pattern.compile(PHONE_PATTERN);
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.isEmpty(value)) {
return true;
}
Matcher matcher = pattern.matcher(value);
return matcher.matches();
}
@Override
public void initialize(Phone constraintAnnotation) {
// 针对注解进行初始化
}
}
}
另外,我还给出了一个实现了参数级别自定义校验的示例,可以参考:SpringBoot 参数级别自定义校验示例。这个示例中,我们自定义了一个校验注解 @NotContainSensitiveWords,用于检验用户提供的“内容”字段中是否包含了敏感词。这个示例将更加深入地了解自定义参数校验器的实现方法。
希望这些内容可以帮助您了解 SpringBoot 如何自定义请求参数校验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 如何自定义请求参数校验 - Python技术站