添加依赖
如想正常食用参数校验功能,请先添加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
注解
//请求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
注解
//获取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
注解
// 使用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
注解
// 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用在级联验证的时候
自定义注解校验
- 定义注解
@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 {};
}
- 定义验证类
/**
* 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());
}
}
- 在需要验证的类上打上注解
@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