Hibernate validator使用以及自定义校验器注解

 更新时间:2020年01月18日 10:07:34   作者:DFYoung  
这篇文章主要介绍了Hibernate validator使用以及自定义校验器注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,用于对 Java Bean 中的字段的值进行验证。Hibernate Validator则是Hibdernate提供的一种对该规范的实现。

——即Hibernate Validator是用来做参数校验。

使用Hibernate Validator提供的注解进行参数校验

注解 释义
@Null 必须为null
@NotNull 不能为null
@AssertTrue 必须为true
@AssertFalse 必须为false
@Min 必须为数字,其值大于或等于指定的最小值
@Max 必须为数字,其值小于或等于指定的最大值
@DecimalMin 必须为数字,其值大于或等于指定的最小值
@DecimalMax 必须为数字,其值小于或等于指定的最大值
@Size 集合的长度
@Digits 必须为数字,其值必须再可接受的范围内
@Past 必须是过去的日期
@Future 必须是将来的日期
@Pattern 必须符合正则表达式
@Email 必须是邮箱格式
@Length 长度范围
@NotEmpty 不能为null,长度大于0
@Range 元素的大小范围
@NotBlank 不能为null,字符串长度大于0(限字符串)

引入依赖

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

Hibernate Validator常用注解

创建测试类

注意必须先进行为null判断,否则其他注解有的不会生效。
比如username加了@Length而不加@NotNull注解,当没有输入username,那么@Length判断将不会生效,判断为null的有@NotNull、@NotEmpty以及@NotBlank
建议自行去掉@NotNull再测试一下

package com.dfyang.validator.entity;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;

public class User {
 @NotBlank(message = "名称不能为空")
 private String name;

 @Range(min = 1, max = 120, message = "年龄必须为1-120岁")
 private Integer age;

 @NotBlank(message = "描述不能为空")
 private String description;

 @NotNull
 @Length(min = 6, max = 18, message = "用户名长度必须为6-18位")
 private String username;

 @NotNull
 @Length(min = 6, max = 18, message = "密码长度必须为6-18位")
 private String password;

 /** get、set方法 */
}

创建测试Controller

@Valid用在参数上,表示对该参数进行校验。

如果对参数校验发现有误,会将错误注入到BindingResult中

我们这里将错误进行打印,也可以直接抛出异常

package com.dfyang.validator.controller;

import com.dfyang.validator.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
public class UserController {

 @GetMapping("/insert")
 @ResponseBody
 public User insertUser(@Valid User user, BindingResult result) {
  if (result.hasErrors()) {
   for (ObjectError error : result.getAllErrors()) {
    System.err.println(error.getDefaultMessage());
   }
  }
  return user;
 }
}

输入 http://localhost:8080/insert?name=张三&descripyion=&age=0&username=123123

使用自定义校验器进行参数校验

创建自定义注解,用于判断年龄是否符合约束

package com.dfyang.validator.constraint;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 性别约束
 */
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SexConstraintValidator.class)
public @interface Sex {

 String message() default "性别有误";

 Class<?>[] groups() default { };

 Class<? extends Payload>[] payload() default { };
}

判断注解的值是否符合约束,这里进行了为null判断,也可以不进行在多加一个@NutNull

package com.dfyang.validator.constraint;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 性别约束逻辑判断
 */
public class SexConstraintValidator implements ConstraintValidator<Sex, String> {
 @Override
 public boolean isValid(String value, ConstraintValidatorContext context) {
  return value != null && (value.equals("男") || value.equals("女"));
 }
}

@Target用于指定使用范围,该处限定只能在字段上使用
@Retention(RetentionPolicy.RUNTIME)表示注解在运行时可以通过反射获取到
@Constraint(validatedBy = xxx.class)指定该注解校验逻辑

2.创建校验实体,使用Hibernate Validator自带注解以及自定义的注解

package com.dfyang.validator.entity;

import com.dfyang.validator.constraint.Sex;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

public class User {
 @NotBlank(message = "名称不能为空")
 private String name;

 @Range(min = 1, max = 120, message = "年龄必须为1-120岁")
 private Integer age;

 @Sex
 private String sex;

 @NotBlank(message = "描述不能为空")
 private String description;

 @NotNull(message = "用户名不能为空")
 @Length(min = 6, max = 18, message = "用户名长度必须为6-18位")
 private String username;

 @NotNull(message = "密码不能为空")
 @Length(min = 6, max = 18, message = "密码长度必须为6-18位")
 private String password;
 
 /** 省略get、set */
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring 循环依赖之AOP实现详情

    Spring 循环依赖之AOP实现详情

    这篇文章主要介绍了Spring 循环依赖之AOP实现详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的盆友可以参考一下
    2022-07-07
  • 教你使用springboot配置多数据源

    教你使用springboot配置多数据源

    发现有很多小伙伴还不会用springboot配置多数据源,今天特地给大家整理了本篇文章,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴很有帮助,需要的朋友可以参考下
    2021-05-05
  • struts2中使用注解配置Action方法详解

    struts2中使用注解配置Action方法详解

    这篇文章主要介绍了struts2中使用注解配置Action方法详解,涉及一个示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java 中模仿源码自定义ArrayList

    Java 中模仿源码自定义ArrayList

    这篇文章主要介绍了Java 中模仿源码自定义ArrayList的相关资料,需要的朋友可以参考下
    2017-03-03
  • 基于OAuth2.0授权系统的验证码功能的实现

    基于OAuth2.0授权系统的验证码功能的实现

    本篇教程给大家分享基于OAuth2.0授权系统的验证码功能的实现,验证码功能的实现是采用Zuul网关的Filter过滤器进行校验验证码,具体实现代码跟随小编一起看看吧
    2021-05-05
  • SpringBoot+WebMagic实现网页爬虫的示例代码

    SpringBoot+WebMagic实现网页爬虫的示例代码

    本文是对spring boot+WebMagic+MyBatis做了整合,使用WebMagic爬取数据,然后通过MyBatis持久化爬取的数据到mysql数据库,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Spring Cloud Gateway打造可扩展的微服务网关

    Spring Cloud Gateway打造可扩展的微服务网关

    微服务网关是一个位于客户端和后端微服务之间的服务器,用于处理所有与客户端的通信,Spring Cloud Gateway都是一个值得考虑的选择,它将帮助您更好地管理和保护您的微服务,感兴趣的朋友一起看看吧
    2023-11-11
  • Quarkus的Spring扩展快速改造Spring项目

    Quarkus的Spring扩展快速改造Spring项目

    这篇文章主要为大家介绍了Quarkus的Spring项目扩展,带大家快速改造Spring项目示例演绎,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • java与scala数组及集合的基本操作对比

    java与scala数组及集合的基本操作对比

    这篇文章主要介绍了java与scala数组及集合的基本操作对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java实现搜索功能代码详解

    Java实现搜索功能代码详解

    这篇文章主要介绍了Java实现搜索功能代码详解,实现思路小编给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12

最新评论