实现功能:自定义注解实现对信息封装类中的List集合中的元素信息校验,并支持通过注解属性指定是否允许集合为空。
自定义注解
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = StringListValidator.class)
public @interface StringList {
// 检验失败时的错误提示信息
String message() default "字符串格式错误";
// 集合为空时的错误提示信息
String emptyMessage() default "集合不能为空";
// 校验规则,支持正则表达式
String regexp();
// 集合是否可以为空,默认可以为空
boolean allowEmpty() default true;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
自定义注解解析器
public class StringListValidator implements ConstraintValidator<StringList, List<String>> {
private String regexp = "";
private boolean allowEmpty;
private String emptyMessage;
/**
* 初始化方法
* @param constraintAnnotation
*/
@Override
public void initialize(StringList constraintAnnotation) {
this.regexp = constraintAnnotation.regexp();
this.emptyMessage = constraintAnnotation.emptyMessage();
this.allowEmpty = constraintAnnotation.allowEmpty();
}
/**
* 校验的方法
* @param list
* @param context
* @return
*/
@Override
public boolean isValid(List<String> list, ConstraintValidatorContext context) {
if(CollectionUtils.isEmpty(list)) {
if(!allowEmpty) {
// 必须禁用,不然返回的message信息会在message和emptyMessage之间切换
context.disableDefaultConstraintViolation();
context
.buildConstraintViolationWithTemplate(emptyMessage)
.addConstraintViolation();
}
return allowEmpty;
}
for(String str : list) {
if(!str.matches(regexp)) {
return false;
}
}
return true;
}
}
在封装类中使用注解
/**
* 功能描述:删除学生信息的参数封装类
*/
@Data
public class StudentDeleteReq {
/**
* 学生id集合
* regexp: ids集合中元素校验的正则表达式,会对集合中的每个元素都进行正则表达式校验
* allowEmpty:是否允许集合为空,默认允许为空,false表示不允许集合为空
* message:ids中元素格式检验失败时的提示信息
* emptyMessage:ids集合为空时的提示信息
*/
@StringList(regexp = "^[0-9]{1,20}$", allowEmpty = false, message = "id格式错误", emptyMessage = "id不能为空")
private List<String> ids;
}
在Controller中添加检验注解
/**
* 删除学生信息,支持单个删除和批量删除
*
* @param deleteReq 信息封装类
* @return 操作结果
*/
@PostMapping("/delete")
public Result delete(@Valid @RequestBody StudentDeleteReq deleteReq) {
// 业务代码
。。。。
}
测试
集合为空时的校验错误信息:
集合中元素格式错误时的错误信息: