SpringBoot 参数校验

发布于:2024-07-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

参数校验

  1. 引入springvalidation依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. 参数前添加@Pattern

    public Result registry(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {}
    
  2. 类上添加@Validated

    @Validated
    public class UserController {}
    

异常:jakarta.validation.ConstraintViolationException: registry.password: 需要匹配正则表达式"^\S{5,16}$", registry.username: 需要匹配正则表达式"^\S{5,16}$"

封装对象

对于封装的对象参数:

@PutMapping("/update")
public Result update(@RequestBody @Validated User user) {
    userService.update(user);

    return Result.success();
}
@Data
public class User {
    @NotNull
    private Integer id;
    private String username;
    
    @JsonIgnore
    private String password;
    
    @NotEmpty
    @Pattern(regexp = "^//S{1,10}$")
    private String nickname;
    
    @NotEmpty
    @Email
    private String email;
    private String user_pic;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

分组校验

多个接口对参数的要求不统一会导致混乱和错误

使用分组校验的方式:

@Data
public class Category {
    @NotNull(groups = Update.class)
    private Integer id;

    @NotEmpty(groups = {Add.class, Update.class})
    private String categoryName;

    @NotEmpty(groups = {Add.class, Update.class})
    private String categoryAlias;

    public interface Add{}
    public interface Update{}
}
public Result addCategory(@RequestBody @Validated(Category.Add.class) Category category){}
@PutMapping
public Result update(@RequestBody @Validated(Category.Update.class) Category category) {}

未指定的默认属于Default分组,也可以:

@Data
public class Category {
    @NotNull(groups = Update.class)
    private Integer id;

    @NotEmpty
    private String categoryName;

    @NotEmpty
    private String categoryAlias;


    public interface Add extend Default{}
    public interface Update extend Default{}
}

自定义参数校验

已有的注解不能满足校验要求,需要自定义注解

  1. 首先定义自定义注解

    @Documented
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    // 指定校验规则
    @Constraint(
        validatedBy = {MyValidation.class}
    )
    public @interface Vali {
        // 校验失败后的提示信息
        String message() default "只能是“已发布”或者“草稿”";
        // 指定分组
        Class<?>[] groups() default {};
        // 获取附加信息
        Class<? extends Payload>[] payload() default {};
    }
    
    
  2. 定义处理规则

    public class MyValidation implements ConstraintValidator<Vali, String> {
    
        @Override
        public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
            // 提供校验规则
            return "已发布".equals(s) || "草稿".equals(s);
        }
    }
    
  3. 使用方式和其他注解一致