一、JSR303是什么:
JSR303是Java为Bean数据合法性校验提供给的标准框架
二、为什要用JSR303:
在实际开发中,除了前端需要在表单中验证用户的输入。后台服务也需要对用户传入的参数进行效验,避免他人在得知请求格式后,直接通过类似Postman这样的测试工具进行非常数据请求。
三、快速入门步骤:
1、给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示
a、添加依赖
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
b、添加注解
2、在controller中需要验证的请求开启校验功能 @Valid
效果: 校验错误以后会有默认的响应;
3、给校验的bean后紧跟一个BindingResult,就可以获取到校验的结果
这样就可以自己定义返回数据了
4、使用Apifox(跟postman差不多的请求工具)模拟请求:
成功进行数据效验!
四、更多注解的介绍
扩展:
一、分组效验
1、创建两个借口,里面可以不用写什么内容
2、给效验注解标注什么情况需要进行效验,并标记接口分组
3、在controller中将 @Valid 改成 @Validated() 括号内填写需要校验的组别
使用了分组效验,默认没有指定分组的校验注解@NotBlank,在分组校验情况下不生效,只会在@Validated生效,就是没有指定任何分组的时候才生效。
二、自定义效验
1、编写一个自定义的校验注解
2、模仿其他注解,编写一个自定义的校验器
@Documented
@Constraint(validatedBy = {})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListStatus {
String message() default "{com.qiu07.common.valid.ListStatus.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] Vals() default {};
}
3、建一个配置文件,自定义返回消息
4、自定义一个ConstraintValidator<>的实现类ListValueConstraintValidator
public class ListValueConstraintValidator implements ConstraintValidator<ListStatus,Integer> {
private Set<Integer> set =new HashSet<>();
// 初始化方法
@Override
public void initialize(ListStatus constraintAnnotation) {
int[] vals = constraintAnnotation.Vals();
for(int val : vals){
set.add(val);
}
}
// 判断是否效验成功方法
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(integer);
}
}
5、将ListValueConstraintValidator加入到注解 @Constraint 完善自定义的效验器
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListStatus {
String message() default "{com.qiu07.common.valid.ListStatus.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] Vals() default {};
}
@Constraint(validatedBy = {ListValueConstraintValidator.class},可以指定多个不同的校验器,适配不同的效验)