知识改变命运! SpringBoot系列18-validation分组校验+自定义参数校验器_猿份哥-lskyf博客社区

SpringBoot系列18-validation分组校验+自定义参数校验器

猿份哥 1年前 ⋅ 1324 阅读 ⋅ 0 个赞

原文链接: https://www.lskyf.com/post/212

分组-加入依赖

<dependencies>
     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
</dependencies>

分组-定义分组接口,均为空接口

/**
 * 新增用户组
 */
public interface AddUserGroup {

}
/**
 * 修改用户组
 */
public interface UpdateUseGroup {

}

分组UserBean.java

/**
 * @author yuanfenge
 * @description
 * @createTime 2019 - 3 - 18 11:54
 *
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserBean {
    public static final int ONLINE=1;//在线
    public static final int OFFLINE=-1;//离线
    public static final int LEAVE=2;//离开
    public static final int BUSY=3;//忙碌

    @NotNull(message = "不能为空",groups = {UpdateUseGroup.class})
    private Long id;
    @NotNull(message = "不能为空",groups = {AddUserGroup.class})
    private String name;
    @NotNull(message = "不能为空",groups = {AddUserGroup.class,UpdateUseGroup.class})
    private Integer age;
   }

分组测试代码-GroupController.java

@RestController
public class GroupController {
    /**
     * 没有指定分组接口,不会进行任何校验
     * @param user
     * @return
     */
    @GetMapping("/invalid")
    public UserBean invalid(@Validated UserBean user){
        return user;
    }

    /**
     * 测试地址: http://localhost:8080/add?name=%E5%B0%8F%E6%98%8E&age=18
     * @param user
     * @return
     */
    @GetMapping("/add")
    public UserBean userAdd(@Validated(AddUserGroup.class) UserBean user){
        return user;
    }
}

自定义校验器-新增CustomUseGroup.java接口

/**
 * 自定义校验器分组
 */
public interface CustomUseGroup {

}

自定义校验器-StatusConstraintValidator.java


/**
 * @author yuanfenge
 * @description 自定义StatusConstraintValidator implements ConstraintValidator<自定义注解类,要校验的参数类型>
 */
public class StatusConstraintValidator implements ConstraintValidator<Status,Integer> {
    Set<Integer> set=new HashSet<>();

    /**
     * 初始化时将数据添加到集合中
     * @param annotation
     */
    @Override
    public void initialize(Status annotation) {
        int[] values = annotation.values();
        for (int v:values) {
            if (!set.contains(v)){
                set.add(v);
            }
        }
    }

    /**
     * 在此方法进行校验
     * @param value
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        // TODO 校验业务代码
        //如果值符合校验通过
        return set.contains(value);
    }
}

自定义校验器-定义自定义注解Status(可以参照@NotNull注解)


@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { StatusConstraintValidator.class})//指定StatusConstraintValidator校验器,可以指定多个校验器
public @interface Status {
    //指定错误默认提示信息
    String message() default "{com.yuanfenge.valid.group.custom.Status.error}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
    
    //定义注解方法:接收一个数组
    int [] values() default { };
}

自定义校验器-新建默认消息提示文件配置

resources下新建ValidationMessages.properties

com.yuanfenge.valid.group.custom.Status.error=状态错误

自定义校验器-UserBean.java新增如下代码

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserBean {
            //自定义校验器Status
            @Status(values={ONLINE,OFFLINE,LEAVE,BUSY},groups = {CustomUseGroup.class})
            private Integer status;
    }

自定义校验器-测试GroupController.java代码

@RestController
public class GroupController {
          /**
           * 测试地址:http://localhost:8080/customValid?status=100
           * 自定义校验器地址:
           * @param user
           * @return
           */
          @GetMapping("/customValid")
          public UserBean customizeValid(@Validated(CustomUseGroup.class) UserBean user){
              return user;
          }
}

JSR303注解使用场景列表

| 注解 | 使用场景 |

| ---- | ---- |

| AssertFalse | 只能为false |

| AssertTrue | 只能为true |

| DecimalMax | 必须小于${inclusive == true ? '或等于' : ''}{value} |

| DecimalMin | 必须大于${inclusive == true ? '或等于' : ''}{value} |

| Digits | 数字的值允许范围(只允许在{integer}位整数和{fraction}位小数范围内) |

| Email | 一个合法的电子邮件地址 |

| Future | 需要是一个将来的时间 |

| FutureOrPresent | 需要是一个将来或现在的时间 |

| Max | 最大不能超过{value} |

| Min | 最小不能小于{value} |

| Negative | 必须是负数 |

| NegativeOrZero | 必须是负数或零 |

| NotBlank | 不能为空 |

| NotEmpty | 不能为空 |

| NotNull | 不能为null |

| Null | 必须为null |

| Past | 需要是一个过去的时间 |

| PastOrPresent | 需要是一个过去或现在的时间 |

| Pattern | 需要匹配正则表达式"{regexp}" |

| Positive | 必须是正数 |

| PositiveOrZero | 必须是正数或零 |

| Size | 个数必须在{min}和{max}之间 |

源码下载链接

原文链接: https://www.lskyf.com/post/212

作者:猿份哥,版权所有,欢迎保留原文链接进行转载:)


全部评论: 0

    我有话说:

    SpringBoot系列17-统一异常处理(包含简单的JSR303参数校验

    原文链接:https://www.lskyf.com/post/211 方法1.通过ControllerAdvice实现+简单的JSR303参数校验实现 1.1 加入依赖 <

    SpringBoot系列9-使用jasypt定义stater运行时动态传入加密密码

    文章目录 1.新建springboot-encryption-configuration项目实现stater 2.pom文件引入jasypt 3.在resources/support/下配置

    spring boot系列4-定时任务-springboot带的scheduled超级简单

    需求:创建一个每天凌晨0点执行的定时任务1.创建任务 /** * @author 天空蓝蓝的 */ @Slf4j @EnableScheduling @Component public class

    Spring Boot系列7-SpringBoot+mybatis+druid+TypeHandler

    介绍在SpringBoot中集成mybatis和druid以及定义TypeHandler 创建数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------...

    Spring Boot系列1-helloword

      使用springboot简单轻松创建helloword SpringBoot系列1-helloword 关于springboot这是摘自官方的一段话 Spring Boot

    Spring Boot系列6-SpringBoot中使用servlet

    介绍在SpringBoot中如何使用servlet pom.xml <dependency> <groupId>org.springframework.boot<

    SpringBoot系列15-mysql-multiple-data-sources1

    springboot 多数据源的一个简单示例 多数据源分包加载 新建数据库test1和表tbl_user CREATE TABLE `tbl_user` ( `id` int(11) NOT

    SpringBoot系列10-文件上传

    文章目录 1.先来最简单的 2.设置文件大小,请求大小 3.多文件上传 怎样使用最简单的方式上传文件,如何上传多个文件呢 先来最简单的 pom.xml文件引入依赖文件 <dependencies> <dependenc...

    定义idea File and Code Templates

    1.定义idea File and Code Templates 1.1 给class添加作者,描述,创建时间 #if (${PACKAGE_NAME} && ${PACKAGE

    Spring Boot系列5-定时任务-springboot整合quartz实现动态定时任务

    MyJob实现Job接口,重写execute方法在里面操作我们要执行的业务逻辑。 @Slf4j public class MyJob implements Job { @Autowired private MyService myService;...

    Spring Boot系列2-全局统一异常处理

    原创: 天空和唯美 天空唯美  点击查看原文 为什么要全局统一异常处理呢?如果系统发生了异常,不做统一异常处理,前端会给用户展示一大片看不懂的文字。做统一异常处理后当

    【扩展程序】用广告拦截提高工作效率

    生活处处是广告,又爱又恨的复杂情感! 现在各种网站都免不了广告,然后有强迫症的我就是想一直关闭关闭,结果浪费没有必要的时间,然后之前同事安利了一个广告拦截,有安装过,是起到了一定的作用,虽然不是

    开启免打扰模式——Chrome谷歌浏览器广告拦截

    我们在Chrome谷歌浏览器浏览网页的时候经常被太多广告打扰,阻挡我们视线。如果你也有这些烦恼,那么试试下面几款广告拦截吧,使用了之后心情确实一个happy了得! AdGuard 广告拦截 下载

    SpringBoot系列19-防止重复请求,重复表单提交超级简单注解的实现之四(终极版II)

    前言: 根据最新spring boot:2.5.0版本和在《SpringBoot防止重复请求,重复表单提交超级简单的注解实现之四(终极版I)》之上化繁为简抽取更实用的代码,新增超时机制 防重复提交

    加入公众号
    加入公众号