关于@Valid注解大全以及用法规范

 更新时间:2022年01月26日 11:42:57   作者:通尼渣渣  
这篇文章主要介绍了关于@Valid注解大全以及用法规范,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@Valid注解大全及用法规范

注解描述
@AssertFalse带注解的元素必须为false,支持boolean/Boolean
@AssertTrue带注解的元素必须为true,支持boolean/Boolean
@DecimalMax带注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin带注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Digits带注解的元素必须是一个可接受范围内的数字
@Future带注解的元素必须是将来的某个时刻、日期或时间
@Max带注解的元素必须是一个数字,其值必须小于等于指定的最大值
@Min带注解的元素必须是一个数字,其值必须大于等于指定的最小值
@NotNull带注解的元素不能是Null
@Null带注解的元素必须是Null
@Past带注解的元素必须是过去的某个时刻、日期或时间
@Pattern带注解的元素必须符合指定的正则表达式
@Size带注解的元素必须大于等于指定的最小值,小于等于指定的最大值
@Email带注解的元素必须是格式良好的电子邮箱地址
@NotEmpty带注解的元素不能是空,String类型不能为null,Array、Map不能为空,切size/length大于0
@NotBlank字符串不能为空、空字符串、全空格
@URL字符串必须是一个URL

@Valid注解规范用户请求的参数

业务场景

对于一个用户的注册操作(Post请求),往往涉及到账号(username)、密码(password)的Post提交:

//用户发送POST请求创建新的用户
@PostMapping
public User create(@RequestBody User user){
    /**
        一些数据持久化操作,如:写入数据库
    **/
    //打印用户提交的信息
    System.out.println(user.getId());
    System.out.println(user.getUsername());
    System.out.println(user.getPassword());
    System.out.println(user.getBirthday());
    return user;
}

业务出现的问题

但用户往往会不小心提交了空的密码来注册,这是不允许的,因此我们往往需要对用户提交的密码信息进行空判断,常见的方法是直接进行if语句的空判断:

//用户发送POST请求创建新的用户
@PostMapping
public User create(@RequestBody User user){
    if( StringUtils.isBlank(user.getPassword())){
        //用户输入密码为空,进行异常处理
    }
    /**
        一些数据持久化操作,如:写入数据库
    **/
    //打印用户提交的信息
    System.out.println(user.getId());
    System.out.println(user.getUsername());
    System.out.println(user.getPassword());
    System.out.println(user.getBirthday());
    return user;
}

以上方法看似行得通,但一旦Post的方法变多,则需要对每个Post请求都进行一次if判断是否为空,代码变得冗余,而且一旦修改一个地方,所有if语句都需要修改,可维护性就变得很差。

优化的解决方案

那么,有没有一种方法可以一劳永逸、既没有大量代码冗余,可维护性又好呢?这时 javax.validation包下的@Valid注解就派上用场了。

1.首先,我们在实体类User.java中的密码(password)属性加上@NotBlank注解(hibernate.validator.constraints包)

import org.hibernate.validator.constraints.NotBlank;
public class User {
    public interface UserSimpleView{}
    public interface UserDetailView extends UserSimpleView{}
    private String username;
    //给该属性加入NotBlank非空的约束
    @NotBlank
    private String password;
    private String id;
    private Date birthday;
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @JsonView(UserSimpleView.class)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

2.我们在Controller类的Post方法的参数中加入@Valid注解,并使用BindingResult将错误信息作为日志打印到后台

@PostMapping
public User create(@Valid @RequestBody User user,
                       BindingResult errors){
    if (errors.hasErrors()){
        //异常处理
        errors.getAllErrors().stream().forEach(error -> System.out.println(error.getDefaultMessage()));
    }
    user.setId("1");
    System.out.println(user.getId());
    System.out.println(user.getUsername());
    System.out.println(user.getPassword());
    System.out.println(user.getBirthday());
    return user;
}

3.这时,当我们向服务器Post提交空的密码信息时,后台会打印出错误信息:

may not be empty

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JavaSE文件操作工具类FileUtil详解

    JavaSE文件操作工具类FileUtil详解

    这篇文章主要为大家详细介绍了JavaSE系列之文件操作工具类FileUtil,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • java使用Cookie判断用户登录情况的方法

    java使用Cookie判断用户登录情况的方法

    这篇文章主要为大家详细介绍了java使用Cookie判断用户登录情况,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java通过python命令执行DataX任务的实例

    Java通过python命令执行DataX任务的实例

    今天小编就为大家分享一篇Java通过python命令执行DataX任务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Spring MVC处理响应的案例详解

    Spring MVC处理响应的案例详解

    当服务器向客户端响应数据时,SpringMVC框架会使用“转换器”(Converter)将方法的返回值进行转换,SpringMVC框架还会自动使用不同的转换器,因此这篇文章就给大家详细介绍一下Spring MVC如何处理响应并附上案例,需要的朋友可以参考下
    2023-06-06
  • Java类加载器ClassLoader的使用详解

    Java类加载器ClassLoader的使用详解

    类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例的代码模块。本文主要和大家聊聊JVM类加载器ClassLoader的使用,需要的可以了解一下
    2022-12-12
  • java基本教程之线程让步 java多线程教程

    java基本教程之线程让步 java多线程教程

    本文对Thread中的线程让步方法yield()进行介绍,yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权,大家参考使用吧
    2014-01-01
  • SpringBoot中邮件任务的使用

    SpringBoot中邮件任务的使用

    这篇文章主要介绍了SpringBoot中邮件任务的使用,SpringBoot 邮件任务是指使用SpringBoot框架来实现邮件发送和接收的功能,通过SpringBoot的自动配置和简化的开发流程,我们可以轻松地集成邮件功能到我们的应用程序中,需要的朋友可以参考下
    2023-10-10
  • Spring注解@Value在controller无法获取到值的解决

    Spring注解@Value在controller无法获取到值的解决

    这篇文章主要介绍了Spring注解@Value在controller无法获取到值的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 关于spring data jpa一级缓存的问题

    关于spring data jpa一级缓存的问题

    这篇文章主要介绍了关于spring data jpa一级缓存的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java中easypoi的使用之导入校验

    Java中easypoi的使用之导入校验

    因工作需要,使用easypoi导入表格,并进行校验,将表格中有问题的地方,给出提示信息,以表格形式返回,下面这篇文章主要给大家介绍了关于Java中easypoi的使用之导入校验的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论