前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Security(使用hibernate-validator)

Spring Security(使用hibernate-validator)

作者头像
用户7386338
发布2020-05-29 16:09:29
9930
发布2020-05-29 16:09:29
举报
文章被收录于专栏:Java患者Java患者

Hibernate-Validator介绍

hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现。使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。如果参数不能通过校验,报400错误,请求格式不正确。

在使用hibernate-validator之前,我们需要引入相应的jar包

代码语言:javascript
复制
<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.9.Final</version>
</dependency>

相关注解

@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(限字符串)

@Pattern(regex=)

字符串必须匹配正则表达式

注意:DecimalXX可以对字符串的数字进行校验。

Hibernate-validator使用

假设我们一个更新用户信息的接口,需要使用User对象进行接收参数,并且要求密码不能为空,生日必须是过去的时间。这时可以在User类中给这2个属性加上对应的注解。如:

代码语言:javascript
复制
@NotBlank(message = "密码不能为空")
private String password;
@Past(message = "生日必须是过去的时间")
private Date birthday;

如果需要校验的参数位于请求体中,那么在验证请求参数时,在User user前面加注解 @Valid。

代码语言:javascript
复制
  @PutMapping("/{id:\\d+}")
  public User update(@RequestBody @Valid User user, BindingResult errors) {
      if(errors.hasErrors()) {
          // may not be empty错误信息。后面我们会学如何自定义
          errors.getAllErrors().stream().forEach(error -> {
              FieldError fieldError = (FieldError) error;
              String message = fieldError.getField() + error.getDefaultMessage();
              System.out.println(message);
          });
      }
      user.setId("1");
      return user;
  }

当我们参数传过来以后。数据会根据对象中的注解,对数据的合法性进行一个校验,校验后的信息会被封装到一个BindingResult的对象里,作为方法的参数传进来。我们可以利用BindingResult对象包装错误消息放回前端,让他们知道哪些字段有什么错误。

如果对象内部包含另一个对象作为属性,那么我们在对象的属性上加@Valid,可以验证作为属性的对象内部的验证。

自定义校验器

有时候,我们需要对特殊的字段做特定的校验,那么我们就可以自定义校验器。下面我们来创建一个@MyConstraint的校验注解。

代码语言:javascript
复制
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
// 
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
    // 必须要有的三个属性
    String message();
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

我们的校验逻辑是写在校验逻辑写在MyConstraintValidator这个类上面,它需要实现ConstraintValidator的接口。

代码语言:javascript
复制
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> {

    @Override
    public void initialize(MyConstraint constraintAnnotation) {
        System.out.println("初始化做的工作");
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return false;
    }
}

这个接口需要指定二个泛型,第一个是我们校验的注解类。第二个指定我们要对什么类型进行校验。initialize方法是初始化时候调用的。isValid是校验的时候用的,isValid方法返回true表示校验通过,返回false表示校验不通过。

在Spring的项目中,允许在这个类中注入Spring的东西,如使用@Autowired注解注入Bean对象。

在User类中对username字段使用:

代码语言:javascript
复制
@MyConstraint(message = "这是一个测试")
private String username;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 相关注解
  • Hibernate-validator使用
  • 自定义校验器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档