Hibernate Validation自定义注解校验的实现

情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则。

自定义注解进行校验的步骤

  • 写一个校验注解,在注解中指定校验器类,校验注解与校验器一般一一对应。
  • 写一个校验器类并在校验器类中写校验逻辑,校验器必须实现ConstraintValidator<?, ?>接口,第一个参数是对应的注解,第二个参数是要校验的属性的类型

代码示例

校验注解

package com.kunlun.validation.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

import com.kunlun.validation.validator.KlPatternValidator;

/**
 * 自定义的校验注解
 * 规则:
 * 1.如果字符串为空串或者为null,则不进行正则校验
 * 2.如果字符串不为空串,则必须进行正则校验
 * @author xc
 * @date 2018年1月19日上午11:38:02
 */
@Documented
// 指定该注解可以使用的地方
@Target(value= {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
// 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口
@Constraint(validatedBy=KlPatternValidator.class)
public @interface KlPattern {
  /*
   * 用于验证的注解下列这三个方法必须要,这是Hibernate Validation框架要求的,否则程序再在调用的时候会报错
   * default用于对属性给定默认值
   * 如果不给定默认值,则在使用注解的时候必须给属性指定属性值,否则报错
   * 给定默认值时,在使用注解的时候可以不用指定属性值
   */
  String message() default "不符合正则!";

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

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

  // 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错
  String regex();
  // value属性,加上了default "mercy" 使得该属性在使用注解的时候可以不用输入也不会报错
  String value() default "mercy";
}

与上面校验注解对应的校验器类

package com.kunlun.validation.validator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import com.kunlun.validation.annotation.KlPattern;

/**
 * KlPatternValidator是KlPattern注解实际调用的验证器
 * 在KlPatternValidator中完成校验逻辑
 *
 * @author xc
 * @date 2018年1月19日上午11:44:38
 */
public class KlPatternValidator implements ConstraintValidator<KlPattern, String> {

  private String regex;

  /**
   * 通过initialize()可以获取注解里的属性值
   */
  @Override
  public void initialize(KlPattern constraintAnnotation) {
    ConstraintValidator.super.initialize(constraintAnnotation);
    regex = constraintAnnotation.regex();
  }

  /**
   * 实际验证逻辑
   * 返回值为true表示验证通过,
   * 返回值为false表示验证未通过
   */
  @Override
  public boolean isValid(String s, ConstraintValidatorContext ctx) {

    // 当前前端传过来的请求参数是空串,或者没传的时候,不进行后续正则校验
    if ("".equals(s) || s == null) {
      return true;
    }

    // 进行正则校验
    if(s.matches(regex)) {
      return true;
    }

    return false;
  }
}

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

(0)

相关推荐

  • 如何自定义hibernate validation注解示例代码

    Bean Validation 中内置的 constraint @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) 被注释的元素必须是一个数字,其

  • Hibernate Validation自定义注解校验的实现

    情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验.上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则. 自定义注解进行校验的步骤 写一个校验注解,在注解中指定校验器类,校验注解与校验器一般一一对应. 写一个校验器类并在校验器类中写校验逻辑,校验器必须实现ConstraintValidator<?, ?>接口,第一个参数是

  • SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解

    目录 springboot常见httpget,post请求参数处理 PathVaribale获取url路径的数据 RequestParam获取请求参数的值 注意 GET参数校验 POSTJSON参数校验 自定义注解校验 总结 spring boot 常见http get ,post请求参数处理 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 GET一般用于查询数

  • springboot使用hibernate validation对参数校验的实现方法

    springboot天生支持使用hibernate validation对参数的优雅校验,如果不使用它,只能对参数挨个进行如下方式的手工校验,不仅难看,使用起来还很不方便: if(StringUtils.isEmpty(userName)){ throw new RuntimeException("用户名不能为空"); } 下面将介绍hibernate validation的基本使用方法. 一.引入依赖 这里在springboot 2.4.1中进行实验,引入以下依赖: <pare

  • ConstraintValidator类如何实现自定义注解校验前端传参

    前言 今天项目碰到这么一个问题,前端传递的json格式到我的微服务后端转换为vo类,其中有一个Integer的字段后端希望它在固定的几个数里面取值,例如只能取值1.2.4. 一般咱们的思路是啥呢,找一些spring为我们提供的类似@Length.@NotBlank这些注解加在参数上面. 像下面这样 不过我这个校验一时间想不起来用哪个注解了,咋整呢?行吧,咱不求人,自己实现一个. 补充一句话,千万别直接拿着实体类往后传递到service层校验哈,太low了这样子. 一.利用@Constraint定

  • Java Validation Api如何实现自定义注解

    背景 官方提供的注解多数可以解决现实业务场景中基本业务校验,但有些特殊场景因业务的复杂性,也还是需要在入口处对入参进行各种角度的校验,以求简化业务层的处理,降低业务处理复杂性与方法入口的强约束性. 以上背景,下面就举个简单Demo进行自定义注解校验的实现. 注解定义类 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; impor

  • javax.validation自定义日期范围校验注解操作

    实际项目中经常需要对传入的日期时间进行判断,如是否为一年内,几个月之内,几天前,几天之内等等的需求. 如要求前端传入的日期是要为当前日期一年内的某个日期,基于jdk8的LocalDateTime or LocalDate等常用的做法如下: // 前端传字符串如'2020-07-13 09:09:09' springmvc接收并转换为LocalDateTime类型 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd

  • 如何通过自定义spring invalidator注解校验数据合法性

    目录 自定义spring invalidator注解校验数据合法性 1.定义校验属性字符串长度的注解 2.实现校验逻辑,校验失败后返回错误提示 3.在模型字段属性上增加校验的注解 4.提供统一的校验方法 5.业务层调用校验方法 springboot 参数验证 validation 1.综述 2.依赖 3.定义实体类 4.创建rest controller 5.实现ExceptionHandler 6.写测试代码 7.跑测试 8.自定义注解 自定义spring invalidator注解校验数据合

  • java自定义注解实现前后台参数校验的实例

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 对这个感兴趣的,请好好看,好好学: package sonn.sonnannotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.anno

  • SpringBoot通过自定义注解实现参数校验

    目录 1. 为什么要进行参数校验 2. 如何实现参数校验 3. 注解实现参数校验 4. 自定义注解实现参数校验 1. 为什么要进行参数校验 在后端进行工作时,需要接收前端传来的数据去数据库查询,但是如果有些数据过于离谱,我们就可以直接把它pass掉,不让这种垃圾数据接触数据库,减小数据库的压力. 有时候会有不安分的人通过一些垃圾数据攻击咱们的程序,让咱们的服务器或数据库崩溃,这种攻击虽然低级但不得不防,就像QQ进行登录请求时,它们向后端发送 账号=123,密码=123 的数据,一秒钟还发1w次,

随机推荐