@Validated提供了一些已经封装好可以直接使用的注解,如:@NotEmpty--->(非空,多用于集合)、@NotNull--->(非空,用在基本类型上)、@URL--->(校验参数是否为url格式)、@Email--->(校验参数是否为邮箱格式)、@Pattern--->(再regext写入正则表达式进行校验)。
自定义校验规则
以校验参数只能是已发布和草稿为例
1、找到已经封装好的注解,下面Empty为例:
package jakarta.validation.constraints;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Constraint(
validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(List.class)
public @interface NotEmpty {
String message() default "{jakarta.validation.constraints.NotEmpty.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
NotEmpty[] value();
}
}
我们对器其进行粘贴修改,自定义一个@State注解
import java.lang.annotation.*;
/**
* @param
* @return
*/
@Documented//元注解
@Target({ ElementType.FIELD})//元注解
@Retention(RetentionPolicy.RUNTIME)//元注解
@Constraint(
validatedBy = {StateValidation.class}
)//指定提供校验规则的类
public @interface State {
//校验不通过返回的错误信息
String message() default "state提供的参数必须是“草稿”或“已发布”";
//指定分组
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2、然后对此注释添加一个校验规则类(继承ConstraintValidator<State, String>,其中State是自定义的注释类,String是校验类型)
package com.example.bigevent.validation;
import com.example.bigevent.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
/**
* @param
* @return
*/
public class StateValidation implements ConstraintValidator<State, String> {
/**
* @param s//将来要校验的参数
* @param constraintValidatorContext
* @return true则校验通过,false则校验不通过
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (s.isEmpty()) {
return false;
}
if (s.equals("草稿") || s.equals("已发布")) {
return true;
}
return false;
}
}
3、在需要的地方添加@State即可,下面是总体结构