扩展 validate 实现自定义文件校验注解

本文介绍了如何在SpringBoot中扩展validation-api,创建自定义注解以校验上传文件类型。通过定义注解并指定校验实现类,实现了针对单文件和多文件的校验。在实现过程中遇到了不能组合注解的问题,最后提供了完整的源码。
摘要由CSDN通过智能技术生成
简介:

SpringBoot 提供了优雅的参数校验方式,即使用 validation-api,关于 validation-api 内置的注解这里不作详细的解释,主要为以下几种:

注解 说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 验证注解的元素值(日期类型)比当前时间早
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

但有些时候,内置的并不能满足业务的需要,这里就介绍一下如何扩展 validation-api 实现自定义注解,以校验上传的文件类型为例子,如何实现自定义扩展的注解。

一、注解定义

要实现扩展 validate 框架的注解比较简单,直接在注解上添加 @Constraint 并指定校验的实现类即可

@Inherited
@Target({
   PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {
   MultipartFilesValidator.class, MultipartFileValidator.class})
public @interface MultipartFileVerify {
   

    String message() default "文件校验失败";

    Class<?>[] groups() default {
   };

    Class<? extends Payload>[] payload() default {
   };

    /**
     * 文件类型限制
     */
    FileType[] value() default {
   };

    /**
     * 不允许上传的文件类型,不指定则不作限制
     */
    Fil
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您可以使用Java中的自定义注解实现这一功能。以下是一个示例代码,您可以根据您的需求进行修改: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MyValidation { int[] validValues(); // 定义需要校验的值 boolean notEmpty() default false; // 定义是否需要校验非空 String message() default "Validation failed!"; // 定义校验失败时的提示信息 } ``` 在这个示例中,我们定义了一个名为MyValidation的注解,该注解包含三个属性:validValues、notEmpty和message。其中,validValues表示需要校验的值,notEmpty表示是否需要校验非空,message表示校验失败时的提示信息。 接下来,您可以在需要进行校验的变量上添加该注解,例如: ``` public class MyClass { @MyValidation(validValues = {1, 2}, notEmpty = true, message = "Validation failed for a or b!") private int a; @MyValidation(validValues = {1, 2}, notEmpty = true, message = "Validation failed for a or b!") private String b; // 省略其他代码 } ``` 在这个示例中,我们在变量a和b上添加了MyValidation注解,并设置了相应的属性。当需要对这些变量进行校验时,您可以使用反射来获取这些注解,并根据注解定义的规则进行校验。例如: ``` public static void validateObject(Object obj) throws Exception { Class<?> clazz = obj.getClass(); for (Field field : clazz.getDeclaredFields()) { if (field.isAnnotationPresent(MyValidation.class)) { MyValidation validation = field.getAnnotation(MyValidation.class); field.setAccessible(true); Object value = field.get(obj); if (value == null) { throw new Exception("Validation failed: " + field.getName() + " is null!"); } if (validation.notEmpty() && value instanceof String && ((String) value).isEmpty()) { throw new Exception("Validation failed: " + field.getName() + " is empty!"); } boolean valid = false; for (int validValue : validation.validValues()) { if (value instanceof Integer && ((Integer) value).intValue() == validValue) { valid = true; break; } } if (!valid) { throw new Exception("Validation failed: " + field.getName() + " is invalid!"); } } } } ``` 在这个示例中,我们定义了一个validateObject方法,该方法接收一个Object类型的参数,并使用反射来获取该对象中所有带有MyValidation注解的变量。然后,根据注解定义的规则进行校验,如果校验失败,则抛出一个异常。 您可以根据您的实际需求进行修改和扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值