Spring Boot简明教程--参数校验

2021-01-29 10:53:55 浏览数 (1)

添加依赖

如想正常食用参数校验功能,请先添加hibernate Validator依赖,SpringBoot已经集成了该依赖,就不必单独导入了,是不是更香了呢!

代码语言:javascript复制
<dependency>
       <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

常用属性注解

代码语言:javascript复制
@Null   被注释的元素必须为 null
@NotNull    被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse    被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past   被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email  被注释的元素必须是电子邮箱地址
@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty   被注释的字符串的必须非空
@Range(min=, max=)  被注释的元素必须在合适的范围内

常用参数注解

代码语言:javascript复制
@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@RequestBody 利用一个对象去获取前端传过来的数据

@PathVaribale

在类上添加@Validated注解

代码语言:javascript复制
//请求URL:localhost:8080/hello/id 获取id值
//在浏览器中 输入地址:localhost:8080/hello/100,输出:id:100
id:81name:hello
@RestController
@Validated
public class HelloController {
    @GetMapping(value="/hello/{id}")
    public String sayHello(@PathVariable("id") Integer id){
        return "id:" id;
    }
}

@RequestParam

在类上添加@Validated注解

代码语言:javascript复制
//获取url参数值,如localhost:8080/hello?id=100,输出:id:100
@RestController
@Validated
public class HelloController {
    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(@RequestParam Integer id){
        return "id:" id;
    }
}

@RequestBody

在类上可以不用添加注解,但是在参数列表里需要添加@Validated注解或者@Valid注解

代码语言:javascript复制
// 使用postman
public class User {
    private Integer id;
    @Length(min = 2)
    private String name;
}
@RestController
@Validated
public class HelloController {
    @GetMapping("/test")
    public User gettest(@RequestBody @Validated User user){
        return user;
    }
}

拓展

级联验证

顾名思义在一个实体类中包含其他的实体类,其他的实体类也需要做参数校验。解决方案:在其他类上添加@Valid注解

代码语言:javascript复制
// school类
@Data
public class School {
    @Length(min = 2)
    private String name;
}
// User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;
    @Length(min = 2)
    private String name;
    @Valid
    private School school;
}
// controller
@RequiredArgsConstructor
@RestController
@Validated
public class HelloController {
    @GetMapping("/test")
    public User gettest(@RequestBody @Validated User user){
        return user;
    }
}

@Valid和@Validated关系

  • @Valid和@Validated具有一定的相似性,在一些情况下@Valid可以替代@Validated
  • 推荐使用方法:在开启验证的时候优先使用@Validated,将@Valid用在级联验证的时候

自定义注解校验

  • 定义注解
代码语言:javascript复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
    String message() default "passwords are not equal";
    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
  • 定义验证类
代码语言:javascript复制
/**
 * 1.要实现ConstraintValidator接口
 * 2.该接口是一个泛型有两个参数,第一个参数是对应的注解类型,第二个参数是PasswordEqual自定义注解修饰的目标的类型
 */
public class PasswordValidator implements ConstraintValidator<PasswordEqual, User> {
    @Override
    public boolean isValid(User user, ConstraintValidatorContext constraintValidatorContext) {
        return user.getPassword1().equals(user.getPassword2());
    }
}
  • 在需要验证的类上打上注解
代码语言:javascript复制
@Data
@AllArgsConstructor
@NoArgsConstructor
@PasswordEqual
public class User {

    private Integer id;
    @Length(min = 2)
    private String name;
    @Valid
    private School school;
    private String password1;
    private String password2;
}

参考文献

https://www.liaoxuefeng.com/wiki/1252599548343744/1265102803921888

0 人点赞