1.首先自定义一个注解,根据校验的业务所需给注解取名
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Documented //元注解
@Retention(RetentionPolicy.RUNTIME) //元注解,表示注解从啥时候开始起作用
@Target( { ElementType.METHOD,ElementType.FIELD }) //元注解,表示该注解可以使用的何处,这里表示可以用在方法和属性上面
@Constraint(validatedBy = {IllegalCharacterValidator.class}) //此处是校验规则的具体实现
public @interface IllegalCharacter {
String message() default "输入内容含有非法字符"; //提示信息,可以写死,可以填写国际化的key
String regexp() default "[`~!@#$%^&*+=|{}':;',\\[\\].<>/?~!@#¥%……&*——+|{}【】‘;:”“’。,、?]";
//下面这两个属性必须添加
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {}; //有效载荷
}
2.注解完成之后,再进行校验数据类规则的实现,也就是IllegalCharacterValidator类去实现这个ConstraintValidator<IllegalCharacter, String>接口,注意:ConstraintValidator接口的两个参数意义,第一个参数是指给哪个注解提供校验规则,第二个的参数是指校验的数据类型。
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IllegalCharacterValidator implements ConstraintValidator<IllegalCharacter, String> {
private String rege;
/**
* 初始参数,获取注解中length的值
*/
@Override
public void initialize(IllegalCharacter arg0) {
this.rege = arg0.regexp();
}
@Override
public boolean isValid(String str, ConstraintValidatorContext constraintValidatorContext) {
if(str != null){
Pattern pattern = Pattern.compile(rege);
Matcher matcher = pattern.matcher(str);
return !matcher.find();
}else{
return true;
}
// constraintValidatorContext.disableDefaultConstraintViolation();//禁用默认的message的值
// //重新添加错误提示语句
// constraintValidatorContext
// .buildConstraintViolationWithTemplate("字符串不能为空").addConstraintViolation();
// }
// return false;
}
}
对于该实现类,主要的是要重写isValid方法,在此方法里面进行具体校验规则的定义。
3.具体用法
//给pojo类的字段加上注解
@IllegalCharacter(message="提示信息",regexp="正则表达式")
private String schoolid;
//给controller类的方法加上注解@Valid
@ResponseBody
@RequestMapping(value="/insertschool",method=RequestMethod.POST)
public String insertschool(@RequestBody @Valid School school, BindingResult result) {
//验证from表单
if (result.hasErrors()){
List<ObjectError> errorList = result.getAllErrors();
for(ObjectError error : errorList){
logger.info(error.getDefaultMessage());
return new Response().failure(error.getDefaultMessage());
}
}
/***具体业务***/
return "";
}
总结:
1.自定义注解
2.自定义校验数据的类要实现ConstraintValidator接口
3.在需要校验的地方使用自定义注解