阿粉写了八千多字,只为讲透参数合法性验证)(三)

简介: 最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。

3.3、注解校验请求参数

上面我们介绍了请求对象的验证方式,那如果直接在方法上对请求参数进行验证是否同样有效呢?

为了眼见为实,下面我们就来模拟在方法上对请求参数进行验证,看看结果如何。

新建一个查询接口query,如下

@RestController
public class UserController {
    @PostMapping("/query")
    public boolean query(@RequestParam("userId") @Valid @NotBlank(message = "用户ID不能为空") String userId ){
        return true;
    }
}

使用postman请求试一试,默认给userId参数为null,结果如下:

25.jpg

很清晰的看到,query()方法中的参数注解验证无效

当我们在UserController类上加上@Validated注解!

@RestController
@Validated
public class UserController {
    @PostMapping("/query")
    public boolean query(@RequestParam("userId") @Valid @NotBlank(message = "用户ID不能为空") String userId ){
        return true;
    }
}

使用postman请求再试一试,结果如下!

26.jpg

很清晰的看到,注解进行了验证,同时还抛出异常ConstraintViolationException


27.jpg

@Validated参数作用于类上时,表示告诉Spring可以对方法中请求参数进行校验!

所有在实际开发的时候,我们可以使用@Validated@Valid注解的组合来对方法中的请求参数请求对象进行校验!

同时,@Validated@Valid注解不仅仅只是验证控制器级别,可以验证任何Spring组件,例如Service层方法入参的验证!

@Service
@Validated
public class UserService {
    public void saveUser(@Valid User user){
        //dao插入
    }
}

3.4、自定义注解验证

默认的情况下,依赖包已经给我们提供了非常多的校验注解,如下!

  • JSR提供的校验注解!

28.jpg

Hibernate Validator提供的校验注解

29.jpg

但是某些情况,例如性别这个参数可能需要我们自己去验证,同时我们也可以自定义一个注解来完成参数的校验,实现方式如下!

  • 新创建一个Sex注解,其中SexValidator类指的是具体的参数验证类
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = SexValidator.class)
@Documented
public @interface Sex {
    String message() default "性别值不在可选范围内";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
  • SexValidator类,实现自ConstraintValidator接口
public class SexValidator implements ConstraintValidator<Sex, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        Set<String> sexSet = new HashSet<String>();
        sexSet.add("男");
        sexSet.add("女");
        return sexSet.contains(value);
    }
}

最后在User实体类上加入一个性别参数,使用自定义注解进行校验!

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User {
    @NotBlank(message = "用户名不能为空!")
    private String userName;
    @Email(message = "邮箱格式不正确")
    @NotBlank(message = "邮箱不能为空!")
    private String email;
    @NotBlank(message = "密码不能为空!")
    @Size(min = 8, max = 16,message = "请输入长度在8~16位的密码")
    private String userPwd;
    @NotBlank(message = "确认密码不能为空!")
    private String confirmPwd;
    /**
     * 自定义注解校验
     */
    @Sex(message = "性别输入有误!")
    private String sex;
}
相关文章
|
11月前
|
前端开发
前端学习笔记202304学习笔记第七天-了解自定义验证函数
前端学习笔记202304学习笔记第七天-了解自定义验证函数
42 0
|
12月前
|
前端开发
前端学习笔记202304学习笔记第七天-自定义验证函数
前端学习笔记202304学习笔记第七天-自定义验证函数
46 0
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
测试技术
字符串a和他许久未见面的同父异母的b(模拟)(思维)
字符串a和他许久未见面的同父异母的b(模拟)(思维)
60 0
|
数据库
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
您好,我是码农飞哥,一直想飞暂时在跑个那个老哥。
212 0
【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记
|
测试技术
软件测试面试题:一个元素明明定位到了,点击无效(也没报错),如果解决?
软件测试面试题:一个元素明明定位到了,点击无效(也没报错),如果解决?
458 0
|
前端开发 Java Spring
阿粉写了八千多字,只为讲透参数合法性验证)(一)
最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。
阿粉写了八千多字,只为讲透参数合法性验证)(一)
|
Java 数据安全/隐私保护 Spring
阿粉写了八千多字,只为讲透参数合法性验证)(二)
最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。
阿粉写了八千多字,只为讲透参数合法性验证)(二)
|
Java Spring
阿粉写了八千多字,只为讲透参数合法性验证)(四)
最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。
阿粉写了八千多字,只为讲透参数合法性验证)(四)
|
数据采集 小程序
关于列表转字符串这个过程的曲折
关于列表转字符串这个过程的曲折
103 0
关于列表转字符串这个过程的曲折