@Valid使⽤详解以及⾃定义注解的简单使⽤
@Valid注解⽤于校验
⼀.@Valid注解的基本使⽤:
步骤1:将@Valid注解直接加在变量ur之前,并且传⼊BindingResult对象(也可不传⼊),⽤于获取校验失败情况下的反馈信息,如下代码
@RestController
@RequestMapping("/ur")
public class UrController {
@PostMapping
public Ur create (@Valid @RequestBody Ur ur, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
System.out.FieldError().getDefaultMessage());
return null;
}
System.out.Id());
System.out.Urname());
System.out.Password());
ur.tId("1");
return ur;
}
}
步骤2:然后在 Ur 类中添加验证信息的要求
@Data
public class Ur {
private String id;
private String urname;
@NotBlank(message = "密码不能为空")
private String password;
}
@NotBlank 注解所指的 password 字段,表⽰验证密码不能为空,如果为空的话,上⾯ Controller 中的 create ⽅法会将message 中的"密码不能为空"返回。
⼆.数据验证的规则
@Entity :表明是⼀个实体类
@Table(name="xxx")不加name默认是类名⼩写
@Id 主键注解
@GeneratedValue()主键⽣成策略
@Column(name="xxx" nullable=fal)列名对应数据表的⼀列 name默认是属性名 nullable是值不能为空默认是true
@Data 等价于@Getter + @Setter 即不⽤写get,t, tostring等⽅法
@Basic ⽤于没有任何标注的 getXxx() ⽅法,默认即为 @Basic,所以若⼀个 getter ⽅法⽆任何注解,可以使⽤ @Basic 注解,也可以不使⽤
@NotEmpty ⽤在集合上⾯(不能注释枚举) 验证注解的元素值不为null且不为空(字符串长度不为0、集合⼤⼩不为0)加了@NotEmpty的String类、Collection 、Map、数组,是不能为null或者长度为0的
@NotBlank ⽤在String上⾯验证注解的元素值不为空不能为null且trim()之后size>0
@NotNull ⽤在所有类型上⾯被注释的元素不能为null ⽤在基本类型上,如Integer、Double。⽤在集合数组时,不能为null,但可以为empty,没有Size的约束(size = 0)
@Null 被注释的元素必须为null
@AsrtTrue 被注释的元素必须为true
@AsrtFal 被注释的元素必须为fal
@Min(value) 被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值
@Max(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值
@DecimalMin(value) 被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值
@DecimalMax(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值
@Size(max,min) 被注释的元素的⼤⼩必须在指定的范围内。值必须是String、集合或数组,并且它的长度要符合给定的范围
@Digits(integer,fraction) 被注释的元素必须是⼀个⼩数,且整数部分位数不能超过integer,⼩数部分位数不能超过fraction
@Past 被注释的元素必须是⼀个过去的⽇期
@Future 被注释的元素必须是⼀个将来的⽇期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电⼦邮件地址也可以通过正则表达式和flag指定⾃定义的email格式
@Length 被注释的字符串的⼤⼩必须在指定的范围内
@NotEmpty 被注释的字符串必须⾮空 @Range 被注释的元素必须在合适的范围内
@Range(min=,max=) 数字必须⼤于等于min,⼩于等于max
@SafeHtml 字符串是安全的html
@URL 字符串是安全的URL
三.⾃定义注解的使⽤
具体问题描述:在校验过程中,需要限制该属性只能传⼊规定内容,于是使⽤枚举类进⾏约束参数。
@Getter
public enum RoleEnum implements CodeEnum {
BUYER(1, "顾客"),
SELLER(2, "商家"),
RIDER(3, "骑⼿"),
;
Integer code;
String message;
RoleEnum(Integer code, String message) {
}
}
然后可在controller中进⾏参数校验,但由于项⽬中该类校验较多,造成代码冗余。故采⽤⾃定义注解进⾏校验
@Data
public class UrInfo {
@EnumValidator(value = RoleEnum.class)
private Integer role = Code();
}
注解的具体内容:
@Target({ElementType.METHOD, ElementType.FIELD}) //在⽅法和属性上⾯起作⽤
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValidatorClass.class)
public @interface EnumValidator {
Class<?> value();
String message() default "The input parameter value is not in the correct enumeration";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
下⾯是校验器:
@Slf4j
public class EnumValidatorClass implements ConstraintValidator<EnumValidator, Object> {
private List<Object> values = new ArrayList<>();
@Override
public void initialize(EnumValidator enumValidator) {
Class<?> clz = enumValidator.value();
Object[] objects = EnumConstants();
try {
Method method = Method("getCode");
if (Objects.isNull(method)) {
throw new Exception(String.format("枚举对象{}缺少字段名为code的字段", Name()));
}
Object value = null;
for (Object obj : objects) {
value = method.invoke(obj);
values.add(value);
}
} catch (Exception e) {
<("[处理枚举校验异常]", e);
}
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return Objects.isNull(value) || ains(value);
}
}
后续遇到此类相似需求,只需创建enum类,并在对应属性上添加注解即可。当然,⾃定义注解能解决的问题还有很多,这就需要根据不同需求进⾏思考调整,希望⼤家都能掌握⾃定义注解的使⽤。