3.3、注解校验请求参数
上面我们介绍了请求对象的验证方式,那如果直接在方法上对请求参数进行验证是否同样有效呢?
为了眼见为实,下面我们就来模拟在方法上对请求参数进行验证,看看结果如何。
新建一个查询接口query
,如下
@RestController public class UserController { @PostMapping("/query") public boolean query(@RequestParam("userId") @Valid @NotBlank(message = "用户ID不能为空") String userId ){ return true; } }
使用postman
请求试一试,默认给userId
参数为null
,结果如下:
很清晰的看到,query()
方法中的参数注解验证无效!
当我们在UserController
类上加上@Validated
注解!
@RestController @Validated public class UserController { @PostMapping("/query") public boolean query(@RequestParam("userId") @Valid @NotBlank(message = "用户ID不能为空") String userId ){ return true; } }
使用postman
请求再试一试,结果如下!
很清晰的看到,注解进行了验证,同时还抛出异常ConstraintViolationException
!
@Validated
参数作用于类上时,表示告诉Spring
可以对方法中请求参数进行校验!
所有在实际开发的时候,我们可以使用@Validated
和@Valid
注解的组合来对方法中的请求参数和请求对象进行校验!
同时,@Validated
和@Valid
注解不仅仅只是验证控制器级别,可以验证任何Spring
组件,例如Service
层方法入参的验证!
@Service @Validated public class UserService { public void saveUser(@Valid User user){ //dao插入 } }
3.4、自定义注解验证
默认的情况下,依赖包已经给我们提供了非常多的校验注解,如下!
- JSR提供的校验注解!
Hibernate Validator提供的校验注解
但是某些情况,例如性别这个参数可能需要我们自己去验证,同时我们也可以自定义一个注解来完成参数的校验,实现方式如下!
- 新创建一个
Sex
注解,其中SexValidator
类指的是具体的参数验证类
@Target({FIELD}) @Retention(RUNTIME) @Constraint(validatedBy = SexValidator.class) @Documented public @interface Sex { String message() default "性别值不在可选范围内"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
SexValidator
类,实现自ConstraintValidator
接口
public class SexValidator implements ConstraintValidator<Sex, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { Set<String> sexSet = new HashSet<String>(); sexSet.add("男"); sexSet.add("女"); return sexSet.contains(value); } }
最后在User
实体类上加入一个性别参数,使用自定义注解进行校验!
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class User { @NotBlank(message = "用户名不能为空!") private String userName; @Email(message = "邮箱格式不正确") @NotBlank(message = "邮箱不能为空!") private String email; @NotBlank(message = "密码不能为空!") @Size(min = 8, max = 16,message = "请输入长度在8~16位的密码") private String userPwd; @NotBlank(message = "确认密码不能为空!") private String confirmPwd; /** * 自定义注解校验 */ @Sex(message = "性别输入有误!") private String sex; }