SpringMVC中常用参数校验类注解使用示例教程

目录
  • 一、环境准备
  • 二、常用的校验注解及示例
  • 三、校验类方法中的普通参数
  • 四、校验类方法中的自定义对象
  • 五、关于@Valid和@Validated的区别联系
  • 六、分组校验
  • 七、自定义校验注解

一、环境准备

在项目中添加以下依赖

gradle

org.hibernate:hibernate-validator:5.3.5.Final

maven

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.5.Final</version>
</dependency>

如果是SpringBoot项目,只需要引入web的starter即可,里面包含了所需依赖

二、常用的校验注解及示例

public class UserDTO {
    //不显示地址
    public interface CommonView {}
    //显示地址
    public interface AdminView extends commonView {}
    @JsonView(value = CommonView.class)
    private String username;
    @JsonView(value = AdminView.class )
    private String address;
    //Getter Setter ...
}    //该参数必须为空
    @Null(message = "无需ID")
    private Integer id;
    //根据正则校验手机号是否是由数字组成
    @Pattern(regexp = "^\\d{11}$", message = "手机格式不正确,不是11位")
    private String telephone;
    //校验该对象是否为null
    //对于String来说,空字符串可通过校验,所以String应该使用@NotBlank进行校验,此处仅做示例而已。
    @NotNull(message = "联系人不能为空")
    private String friendName;
    //校验对象是否是空对象,可用于Array,Collection,Map,String
    @NotEmpty(message = "家庭成员不能为空")
    private List families;
    //校验长度,可以用于Array,Collection,Map,String
    @Size(min = 4, max = 8, message = "用户名长度错误 by size")
    //校验长度,只能用于String
    @Length(min = 4, max = 8, message = "用户名长度错误 by length")
    private String username;
    //javax校验
    @Max(value = 200, message = "年龄一般不会超过200 by max")
    @Min(value = 1, message = "年龄一般不能小于1 by min")
    //hibernate校验,效果等同
    @Range(min = 0, max = 200, message = "年龄范围在0-200之间 by range")
    private Integer age;
    //校验参数是否是False, 相反的是@AssertTrue
    @AssertFalse(message = "用户初始化无需冻结")
    private Boolean lock;
    //String专用
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, max = 12, message = "密码长度不对")
    private String password;
    //使用自定义校验注解->校验时间
    @Past(message = "生日只能为以前的时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date birth;
    //校验Email
    @Email(message = "邮件地址不正确")
    private String email;

三、校验类方法中的普通参数

在类上加@Validated注解

在参数上加上校验注解

以controller层作示例如下:

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController {
    /**
     * 校验请求参数
     */
    @GetMapping
    public String getUser(@Size(min = 5, max = 8, message = "用户名长度超出限制") String username) {
	 return username;
    }
}

四、校验类方法中的自定义对象

在类上加@Validated注解(同普通参数一样都需要加)

在参数上加@Valid,(或者加@Validated也是可以的)

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController {
    /**
     * 校验请求中的自定义对象
     */
    @PostMapping
    public UserDTO saveUserOuter(@RequestBody @Valid UserDTO userDTO) {
        return userDTO;
    }

}

3.在自定义对象中的属性上加上校验注解

public class UserDTO {
    //该参数必须为空
    @Null(message = "无需ID")
    private Integer id;
    //根据正则校验手机号是否是由数字组成
    @Pattern(regexp = "^\\d{11}$", message = "手机格式不正确,不是11位")
    private String telephone;
    //校验该对象是否为null
    //对于String来说,空字符串可通过校验,所以String应该使用@NotBlank进行校验,此处仅做示例而已。
    @NotNull(message = "联系人不能为空")
    private String friendName;
    //校验对象是否是空对象,可用于Array,Collection,Map,String
    @NotEmpty(message = "家庭成员不能为空")
    private List families;
    //校验长度,可以用于Array,Collection,Map,String
    @Size(min = 4, max = 8, message = "用户名长度错误 by size")
    //校验长度,只能用于String
    @Length(min = 4, max = 8, message = "用户名长度错误 by length")
    private String username;
    //javax校验
    @Max(value = 200, message = "年龄一般不会超过200 by max")
    @Min(value = 1, message = "年龄一般不能小于1 by min")
    //hibernate校验,效果等同
    @Range(min = 0, max = 200, message = "年龄范围在0-200之间 by range")
    private Integer age;
    //校验参数是否是False, 相反的是@AssertTrue
    @AssertFalse(message = "用户初始化无需冻结")
    private Boolean lock;
    //String专用
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, max = 12, message = "密码长度不对")
    private String password;
    //使用自定义校验注解->校验时间
    @Past(message = "生日只能为以前的时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date birth;
    //校验Email
    @Email(message = "邮件地址不正确")
    private String email;
	//setter  getter ....
}

五、关于@Valid和@Validated的区别联系

一直对@Valid和@Validated这两个注解非常疑惑,不知道怎么区分和使用。

1.包位置

@Valid: javax.validation, 是javax,也是就是jsr303中定义的规范注解

@Validated: org.springframework.validation.annotation, 是spring自己封装的注解。

2.功能
@Valid就不用说了,是jsr303的规范。我们打开@Validated的源码,可以看到以下注释,

Variant of JSR-303's {@link javax.validation.Valid}, supporting the
specification of validation groups. Designed for convenient use with
Spring's JSR-303 support but not JSR-303 specific.

大致意思就是说@Validated是@Valid的一个变种,扩展了@Valid的功能,支持group分组校验的写法。
那么我们对于@Valid和@Validated就可以这么理解:

能用@Valid的地方通常可以用@Validated替代。需要使用分组校验的时候使用@Validated注解。

六、分组校验

我们有一个用户DTO,其中有id,username两个属性。当保存时,id不需要有值,由数据库自动生成,我们使用@Null注解校验。当更新时,id需要有值,根据ID去更新用户名,我们使用@NotNull注解校验。无论是保存用户还是更新用户,都需要校验用户名,我们使用@NotBlank注解校验。

UserGroupValidDTO

public class UserGroupValidDTO {
    public interface SaveGroup extends Default {}
    public interface UpdateGroup extends Default {}
    @Null(groups = {SaveGroup.class}, message = "不需要传入用户ID")
    @NotNull(groups = {UpdateGroup.class}, message = "用户ID不能为空")
    private Integer id;
    @NotBlank(message = "用户名不能为空")
    private String username;
    //Setter Getter ...
}

定义相应类型的公开接口(SaveGroup,UpdateGroup),给每个校验注解指定groups属性,如果不指定则默认为javax.validation.groups.Default.class。

我们让SaveGroup和UpdateGroup继承了Default, 那么三个接口之间的关系类似如下:

save --> SaveGroup |-->id  @Null
                   |-->Default --> username @NotBlank

update--> UpdateGroup |-->id @NotNull
                      |-->Default --> username @NotBlank

UserController

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController {
    /**
     * 分组校验:保存用户,不能传ID
     */
    @PostMapping("/save")
    public void validSaveUser(@RequestBody @Validated(value = UserGroupValidDTO.SaveGroup.class) UserGroupValidDTO userDTO) {
        //save user
    }
    /**
     * 分组校验:更新用户信息,需要传ID
     */
    @PostMapping("/update")
    public void validUpdateUser(@RequestBody @Validated(value = UserGroupValidDTO.UpdateGroup.class) UserGroupValidDTO userDTO) {
        //update user
    }

}

在方法参数的对象上加@Validated属性,填写Value为对应的接口的class即可,这时候访问不同的接口就会进行不同的校验了。

七、自定义校验注解

有时候默认提供的校验注解无法满足我们的需要,我们需要自定义。例如现有校验注解不支持java8中的LocalDateTime。那么接下来我们自定义一个校验LocalDateTime的注解。该注解判断传入的时间是否是一个过去的时间。

1.创建校验注解

/**
 * @author kingboy--KingBoyWorld@163.com
 * @date 2017/12/29 下午7:24
 * @desc ${DESCRIPTION}.
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PastTimeValidate.class)
public @interface PastDate {
    String message();
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

2.编写校验规则

校验规则也就是枚举PastDate中指定的validateBy属性

/**
 * @author kingboy--KingBoyWorld@163.com
 * @date 2017/12/29 下午7:28
 * @desc .
 */
@CommonsLog
public class PastTimeValidate implements ConstraintValidator<PastDate, LocalDateTime> {
   @Override
   public void initialize(PastDate constraintAnnotation) {
      log.info("init enum PastDate");
   }
   @Override
   public boolean isValid(LocalDateTime localDateTime, ConstraintValidatorContext context) {
      return localDateTime.isBefore(LocalDateTime.now()) ? true : false;
   }
}

写完这些,我们就可以像@Past对Date校验一样使用@PastDate对LocalDateTime进行校验了。

以上就是SpringMVC中常用参数校验类注解使用示例教程的详细内容,更多关于SpringMVC中参数校验注解示例的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot参数校验的最佳实战教程

    我们这里使用hibernate-validator作为对象参数验证器,所以在正式介绍SpringBoot参数验证之前,需要先简单了解一下hibernate-validator的使用. hibernate-validator基本使用 引入依赖 <dependency>     <groupId>org.hibernate</groupId>     <artifactId>hibernate-validator</artifactId>     &

  • SpringMVC实现Validation校验过程详解

    这篇文章主要介绍了SpringMVC实现Validation校验过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.概述 对前端的校验大多数通过js在页面校验,这种方法比较简单,如果对安全性考虑,还要在后台校验. springmvc使用JSR-303(javaEE6规范的一部分)校验规范,springmvc使用的是Hibernate Validator(和Hibernate的ORM) 二.步骤 2.1 引入 Hibernate Vali

  • SpringMVC 数据校验方法(必看篇)

    数据校验在web应用里是非常重要的功能,尤其是在表单输入中.在这里采用Hibernate-Vapdator进行校验,该方法实现了JSR-303验证框架支持注解风格的验证. 一.导入jar包 若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个: classmate-1.3.1.jar hibernate-vapdator-5.4.1.Final.jar hibernate-vapdator-annotation-processor-5.4.1.Final.jar hibernate-v

  • SpringMVC 数据校验实例解析

    这篇文章主要介绍了SpringMVC 数据校验实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.注解方式 二.示例 Spring MVC本身没有数据校验的功能,它使用Hibernate的校验框架来完成. 1.导入pom节点 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> <dependency> <group

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

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

  • SpringMVC中常用参数校验类注解使用示例教程

    目录 一.环境准备 二.常用的校验注解及示例 三.校验类方法中的普通参数 四.校验类方法中的自定义对象 五.关于@Valid和@Validated的区别联系 六.分组校验 七.自定义校验注解 一.环境准备 在项目中添加以下依赖 gradle org.hibernate:hibernate-validator:5.3.5.Final maven <dependency> <groupId>org.hibernate</groupId> <artifactId>

  • java开发MyBatis中常用plus实体类注解符详解

    目录 mybatis-plus常用注解符 1. 表名注解(@TableName) 2. 主键注解(@TableId) 3. 属性注解(@TableField) mybatis-plus常用注解符 1. 表名注解(@TableName) 作用:实体类和数据库中表建立对应关系:如 @TableName("thotset") public class HotsetEntity implements Serializable { private static final long serial

  • spring springMVC中常用注解解析

    一,使用注解: 在spring的配置文件applicationContext.xml中,加入注解扫描.配置项就配置了对指定的包进行扫描,以实现依赖注入. <?xml version="1.0" encoding="UTF-8"?> <span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans&q

  • SpringMVC中常用注解与使用方法详解

    MVC简介 MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式. Model(模型): 通常指的就是我们的数据模型.作用一般情况下用于封装数据. View(视图): 通常指的就是我们的 jsp 或者 html.作用一般就是展示数据的. 通常视图是依据模型数据创建的. Controller(控制器): 是应用程序中处理用户交互的部分.作用一般就是处理程序逻辑的.

  • 如何在spring boot中进行参数校验示例详解

    上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中如何进行参数校验. lombok使用介绍 在介绍参数校验之前,先来了解一下lombok的使用,因为在接下来的实例中或有不少的对象创建,但是又不想写那么多的getter和setter,所以先介绍一下这个很强大的工具的使用. Lombok 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很

  • 详解SpringBoot中的参数校验(项目实战)

    Java后端发工作中经常会对前端传递过来的参数做一些校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,充满了if-else这种校验代码,在代码中相当冗长.例如说,用户注册时,会校验手机格式的正确性,用户名的长度等等.虽说前端也可以做参数校验,但是为了保证我们API接口的可靠性,以保证最终数据入库的正确性,后端进行参数校验不可忽视. Hibernate Validator 提供了一种统一方便的方式,让我们快速的实现参数校验. Hibernate Validator 使用注解,实现声明式校验

  • SpringMVC中请求参数的获取方式

    目录 SpringMVC请求参数获取方式 一.通过 ServletAPI 获取 二.通过控制器方法的形参获取 处理多个同名的请求参数 三.通过 @RequestParam 注解 四.@RequestHeader 注解 五.@CookieValue 注解 六.通过 POJO 获取请求参数 七.解决获取请求参数的乱码问题 SpringMVC请求参数获取方式 一.通过 ServletAPI 获取 可以使用原生 Servlet 获取请求参数,将 HttpServletRequest 作为控制器方法的形参

  • Python中rapidjson参数校验实现

    目录 前言 rapidjson简介和安装 rapidjson基本使用 dumps() 方法 skipkeys ensure_ascii sort_keys dump()方法 Validator class 前言 在使用Django框架开发前后端分离的项目时,通常需要对前端传递过来的参数进行校验,校验的方式有多种,可以使用drf进行校验,也可以使用json进行校验,本文介绍在Python中rapidjson的基本使用以及如何进行参数校验. rapidjson简介和安装 rapidjson是一个性能

  • Java中常用的日期类图文详解

    目录 前言 Date 为什么Date的大部分方法被弃用 注释 翻译 目前可用方法的测试示例 可用方法 示例 Date小结 Calendar 简单介绍 常用的方法 获取实例 获取日期里的信息 日期的加减与滚动 日期的设置 测试实例代码 DateFormat与SimpleDateFormat DateFormat 常用方法 测试实例 SimpleDateFormat 主要方法 测试示例 编写一个简单的日期工具类 工具类 测试示例 总结 前言 本文将分析Java中的Date.Calendar.Date

  • Vue中常用rules校验规则(实例代码)

    在 vue开发中,难免遇到各种表单校验,这里整理了网络上和自己平时高频率用到的一些校验方法.如果错误欢迎指出,后期不断补充更新. 1.是否合法IP地址 export function validateIP(rule, value,callback) { if(value==''||value==undefined||value==null){ callback(); }else { const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|

随机推荐