- 背景: 笔者在工作中遇到问题如下:
开发文件模板 curd,在新建模板对象的时候对数据进行验证,其中有一个属性是文件名称,要求必须是excel文件类型。
- 解决思路:
一开始想着在controller层拿到对象后,属性get出来if else 判断走起,感觉略有不妥,于是乎想着自定义一个数据验证注解来用用,专门用来判断文件类型的。核心思想无非就是拿到文件后缀名进行和预设的类型比较。
- 实现
自定义注解FileType
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Constraint(validatedBy = {FileTypeValidator.class})//指定校验器类
@Documented
@Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface FileType {
String message() default "文件类型不允许";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String[] value();
}
实现自定义校验器FileTypeValidator
public class FileTypeValidator implements ConstraintValidator<FileType, String> {
private List<String> fileNames = new ArrayList<>();
@Override
public void initialize(FileType constraintAnnotation) {
fileNames = Arrays.asList(constraintAnnotation.value());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return StringUtils.isNotBlank(value) && //不能为空
value.lastIndexOf(".")>0 && //要有. 不能以.开头
value.length()-1>value.lastIndexOf(".") && //不能以.结尾
fileNames.contains(value.substring(value.lastIndexOf(".")+1));
}
}
使用 ,在使用到该model时,如需要使用验证需使用注解: @Valid启用
public class VoucherTemplateModel {
@ApiModelProperty("excel路径")
@FileType(value = {"xls","xlsx"})
private String excelUrl;
}
如有不妥,请多指正。。。