由于SpringBoot的Web组件内部集成了hibernate-validator,我们可以直接使用。
常用注解
这些注解使用在pojo上面,接收校验是会自动进行判断是否符合要求,进而提示对应的提示语,也可以使用message参数进行自己指定。
@AssertFalse
@AssertTrue //用于校验boolean为true或者false
@CreditCardNumber //信用卡号大致校验
@DecimalMax(value = “2”)
@DecimalMin(value = “2”) //只能大于或者小于该值
@Digits(integer = 2, fraction = 20) //检测是否为一种数字的 整数、分数、小数位的数字
@Email
@Future //检测时间是否为未来时间
@Past //检测时间是否过去
@Length(min = 0, max = 22) //字符串长度判断
@Max(value = 12)
@Min(value = 1) //最大数值、最小数字
@Size(min = 0, max = 12)//检测size是否在区间内,可以是字符串,list,map,数组
@NotNull //不能为空
@NotBlank //不能为空,自动去掉空格trim()
@NotEmpty //不能为空字符串
@Null
@URL
@Valid
代码使用
直接使用@Valid
注解进行校验,使用参数BindingResult result
来接收结果,MessageSource
对应国际化资源文件提示语,注入使用即可。
@Autowired
private MessageSource messageSource;
@RequestMapping(value = "/validator")
public String validator
(
@Valid DemoEntity entity, BindingResult result
) {
if (result.hasErrors()) {
StringBuffer msg = new StringBuffer();
//获取错误字段集合
List<FieldError> fieldErrors = result.getFieldErrors();
//获取本地locale,zh_CN
Locale currentLocale = LocaleContextHolder.getLocale();
//遍历错误字段获取错误消息
for (FieldError fieldError :
fieldErrors) {
//获取错误信息
String errorMessage = messageSource.getMessage(fieldError, currentLocale);
//添加到错误消息集合内
msg.append(fieldError.getField() + ":" + errorMessage + " , ");
}
return msg.toString();
}
return "验证通过," + "名称:" + entity.getName() + "年龄:" + entity.getAge() + "邮箱地址:" + entity.getMail();
}
}
自定义校验注解
有时可能要定义一些自己的注解来使用。
- 1.创建注解
其中@Constraint
表示提交该注解的校验由指定的类进行校验
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator
{
//flag的有效值多个使用','隔开
String values();
//提示内容
String message() default "flag不存在";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- FlagValidatorClass
public class FlagValidatorClass implements ConstraintValidator<FlagValidator, String> {
//临时变量保存flag值列表
private String values;
//初始化
public void initialize(FlagValidator constraint) {
//将注解内配置的值赋值给临时变量
this.values = constraint.values();
}
public boolean isValid(String obj, ConstraintValidatorContext context) {
//分割定义的有效值
String[] value_array = values.split(",");
boolean isFlag = false;
//遍历比对有效值
for (int i = 0; i < value_array.length; i++) {
//存在一致跳出循环,赋值isFlag=true
if (value_array[i].equals(obj)) {
isFlag = true;
break;
}
}
//返回是否存在boolean
return isFlag;
}
}
初始化的 值就是使用注解的参数值,isValid的obj参数就是外面请求进来需要校验的值。