美文网首页
Hibernate Validator校验工具

Hibernate Validator校验工具

作者: 南湘嘉荣 | 来源:发表于2021-07-01 14:25 被阅读0次

在日常开发中经常需要对一些字段进行校验,如字段不能为空、字段长度、日期格式、邮箱格式、出生日期格式等。

这些与业务不相关却不可缺少的逻辑,是件琐碎繁重的工作。幸好,Hibernate Validator提供了一套比较完善的实现方式。

对于 Spring Boot项目而言,spring-boot-starter-web 包已经引入了 Hibernate Validator 的相关jar 包,所以不需要再引入依赖了,可以开箱即用。

两种校验模式

hibernate validator 有两种校验模式:普通模式快速失败模式

  • 普通模式它会校验所有属性,并返回所有的失败信息
  • 快速失败模式则是只有一个校验失败就会返回

在 Spring 环境下我们可以通过编写配置类来实现使用哪种模式,代码 如下:

@Configuration
public class HibernateValidatorConfiguration {
    @Bean
    public Validator validator(){
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                //  快速失败模式  true表示启用,false表示普通模式
                .addProperty("hibernate.validator.fail_fast","true")
                .buildValidatorFactory();

        return validatorFactory.getValidator();
    }
}

POST请求参数的校验

验证POST请求参数,只要在参数前面添加注解 @Valid 即可。

@PostMapping("/getUser")
public ResponseEntity getUser(@RequestBody @Valid UserEntity user);

GET请求参数的校验

要想校验get请求的参数,同样是需要校验Bean。实体类需要作稍微改动,在类上添加 @Component 注解。

@Data
@Component("ValidUser")
public class UserEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "用户ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(value = "用户名")
    @NotBlank(message = "用户名不能为空")
    private String username;

    @ApiModelProperty(value = "密码")
    @NotBlank(message = "密码不能为空")
    @Length(min = 6,max = 20)
    private String password;
}

在控制层利用 @ModelAttribute 这个注解进行对象属性赋值,@Valid 对属性进行检查。

@RestController
@RequestMapping("/sys/user-entity")
public class UserController {
    @Autowired
    private UserServiceImpl userService;

    @GetMapping("/getUser")
    public ResponseEntity getUser(@ ModelAttribute("ValidUser") @Valid UserEntity user)
}

当发起Get请求时,就会对传入的参数 username 进行校验非空和长度。

http://localhost:8088/sys/user-entity/getUser?username=admin

不过这种方法有个缺陷,就是会对UserEntity中添加了校验注解的所有属性进行校验,所以可以考虑创建一个UserVO对象来用于校验Get请求参数。(暂时还没找到更好的方法)

NotBlank、NotNull、NotEmpty的区别

  • @NotEmpty 用在集合类上面
  • @NotBlank 用在String上面
  • @NotNull 用在基本类型上

常用注解如下:

Constraint 详细信息
@Valid 被注释的元素是一个对象,需要检查此对象的所有字段值
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
@NotBlank 被注释的字符串的必须非空
@URL(protocol=,host=, port=,regexp=, flags=) 被注释的字符串必须是一个有效的url
@CreditCardNumber 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性

相关文章

网友评论

      本文标题:Hibernate Validator校验工具

      本文链接:https://www.haomeiwen.com/subject/hbzrultx.html