Spring Security(使用hibernate-validator)

微信公众号:Java患者
专注Java领域技术分享

Hibernate-Validator介绍

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

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

<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个属性加上对应的注解。如:

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

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

  @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的校验注解。

@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的接口。

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字段使用:

@MyConstraint(message = "这是一个测试")
private String username;

查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值