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

目录
  • @Valid注解大全及用法规范
  • @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

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

(0)

相关推荐

  • 解决@Validated注解无效,嵌套对象属性的@NotBlank无效问题

    目录 @Validated注解无效,嵌套对象属性的@NotBlank无效 步骤 内层对象无法验证 @Validated注解不生效问题.如何使用 1.需要引入的包 2.将@Validated打在controller中需要验证的实体类前面 3.在具体实体类中定义字段的验证规则 4.数据格式校验 在controller中的方法中进行单个参数校验注意事项 @Validated注解无效,嵌套对象属性的@NotBlank无效 最近在做的公司项目是一个表单系统,刚好要用到@Validated注解来对表单字段进

  • spring注解 @Valid 的作用说明

    目录 spring注解 @Valid 的作用 在userRequest类中的属性上使用spring的注解 spring注解 @Valid 作用范围 建立两个基本类 建立一个请求 实验测试 修改UserRequest(对users加入@Valid) 再次发送请求 可以看到Valid生效,此时加上name的值 spring注解 @Valid 的作用 在controller中的方法上面写有注解@Valid UserRequest 的作用. 备注:这里一个@Valid的参数后必须紧挨着一个Binding

  • 使用注解@Validated和BindingResult对入参进行非空校验方式

    目录 注解@Validated和BindingResult对入参非空校验 @Validated 和 BindingResult 使用遇到的坑 注解@Validated和BindingResult对入参非空校验 在项目当中少不了入参校验,服务器和浏览器互不信任,不能因为前端加入参判断了后台就不处理了,这样是不对的. 比如前台传过来一个对象作为入参参数,这个对象中有些属性允许为空,有些属性不允许为空.那么你还在使用if()else{}进行非空判断吗?不妨尝试下使用注解,可以使用@Validated和

  • @validated注解异常返回JSON值方式

    目录 @validated注解异常返回JSON值 使用@Valid注解,对其参数错误异常的统一处理 @validated注解异常返回JSON值 @ControllerAdvice public class ValidParamExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public Map<String, Object> allExceptionHandler(Exception e){

  • 一次踩坑记录 @valid注解不生效 排查过程

    一.背景 在进行一次Controller层单测时,方法参数违反Validation约束,发现却没有抛出预期的[违反约束]异常. 方法参数上的@Valid注解不生效?? 但是以Tomcatweb容器方式启动,请求该API,@Valid注解却生效了,甚是怪异. 代码如下: @RestController @RequestMapping("/api/user/") public class UserController @RequestMapping(value = ""

  • 参数校验Spring的@Valid注解用法解析

    参数校验Spring的@Valid注解 @Valid 注解通常用于对象属性字段的规则检测. 以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : public class Employee { /** 姓名 */ public String name; /** 年龄 */ public Integer age; public String getName() { return name; } publ

  • 快速校验实体类时,@Valid,@Validated,@NotNull注解无效的解决

    目录 校验实体类参数内容不能为空时使用注解校验无效 使用@valid注解首先引入依赖 1.更换方法入参类型 2.错误内容过多 3.使用对象接收错误内容,按自己要求输出 springboot 校验机制 @Validated @Valid 1.探究原因 2.使用@Validated 实现校验机制 3.使用@Valid 实现校验机制 校验实体类参数内容不能为空时使用注解校验无效 使用@valid注解首先引入依赖 如果是SpringBoot项目,引入web开发包,就不需要再单独引入@valid依赖了.因

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

    目录 @Valid注解大全及用法规范 @Valid注解规范用户请求的参数 业务场景 业务出现的问题 优化的解决方案 @Valid注解大全及用法规范 注解 描述 @AssertFalse 带注解的元素必须为false,支持boolean/Boolean @AssertTrue 带注解的元素必须为true,支持boolean/Boolean @DecimalMax 带注解的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin 带注解的元素必须是一个数字,其值必须大于等于指定的最小

  • Restful传递数组参数及注解大全

    RESTful 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 需要传递数组参数的情况,如果是一般的form表单,可以直接定义参数类型为List<String>即可(不能定义为数组类型,否则只能得到一个null). 示例代码如下: @POST @Path("/user" ) public Response createUser(@FormPara

  • SpringMVC使用@Valid注解进行数据验证的方法

    我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验.好在SpringMVC在后台验证给我们提供了一个比较好的支持.那就是使用Valid接口的实现类做数据校验.在这之前我们先做一下准备的工作. 添加相关的Maven依赖 我们先把需要的jar包添加进来. <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api<

  • Spring的组合注解和元注解原理与用法详解

    本文实例讲述了Spring的组合注解和元注解原理与用法.分享给大家供大家参考,具体如下: 一 点睛 从Spring 2开始,为了相应JDK 1.5推出的注解功能,Spring开始加入注解来替代xml配置.Spring的注解主要用来配置和注入Bean,以及AOP相关配置.随着注解的大量使用,尤其相同的多个注解用到各个类或方法中,会相当繁琐.出现了所谓的样本代码,这是Spring设计要消除的代码. 元注解:可以注解到别的注解上去的注解. 组合注解:被注解的注解,组合注解具备其上的元注解的功能. Sp

  • springboot @Valid注解对嵌套类型的校验功能

    @Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用: 实体: public class DepartmentDto { @ApiModelProperty("id") private String id; @ApiModelProperty("上级Id") private String parentId; @ApiModelPr

  • @Valid注解的作用及@Valid注解与@Validated的区别

    目录 1.@Valid注解 2.@Valid与@Validated的区别 注解位置 分组校验 组序列 嵌套校验 1.@Valid注解 用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息. @ApiOperation(value = "Shipping receive completion request from shiphub frontend or app client like OMS",

  • 关于注解FeignClient的使用规范

    注解FeignClient使用规范 首先是对FeignClient里的常用属性 contextId:当有多个服务调用方法不想写在一个接口里,就要使用到 name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现 url:url一般用于调试,可以手动指定@FeignClient调用的地址 fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接

  • MyBatis @Select注解介绍:基本用法与动态SQL拼写方式

    目录 1.@Select注解基本用法 2.@Select注解动态SQL拼写 @Select动态参数参考 1.@Select注解基本用法 @Select注解的目的是为了取代xml中的select标签,只作用于方法上面. 下面看一下@Select注解的源码介绍: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Select {     String[] value(); } 从上述可以

随机推荐