【Java日常业务开发】关于validator自定义校验注解规则的实现思路

本文介绍了如何在Java中自定义注解并实现校验规则,包括创建`IllegalCharacter`注解,以及通过`ConstraintValidator`接口进行数据验证,最后展示了在SpringMVC中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.在需要校验的地方使用自定义注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值