小强哥博客

小强哥,小强哥博客,技术大咖

Spring自定义Vlidate

hibernate-Valiate自身提供了一些用于验证VO,如对hibernate-Valiate还不是很了解可以阅读 https://www.cnblogs.com/leechenxiang/p/5490930.html 那么既然你看到本篇内容我猜测你当前肯定遇到了一个问题「hibernate-Valiate不能满足我了,如何自定义?」,那么我们快速进入正题(程序猿的时间都是宝贵的)

这里我们举例一个场景:验证页面传入的参数格式必须为「2019-01-01」格式,否则提示「时间格式不匹配」,我们使用正则表达式「^\d{4}\-\d{1,2}\-\d{1,2}$」来验证格式是否匹配。

第一步,我们先定义一个注解「@StringDate」

package org.lark.framework.valid.date;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

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

/**
 * Created by zhaoqiang on 19-5-15
 */
@Documented
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = {StringDateValid.class})
public @interface StringDate {

  boolean require() default false;

  String message();

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

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


第二步,定义一个「StringDateValid」也就是「@StringDate」具体的执行类

package org.lark.framework.valid.date;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;

/**
 * Created by zhaoqiang on 19-5-15
 */
public class StringDateValid implements ConstraintValidator<StringDate, String> {

  private final String regx = "^\\d{4}\\-\\d{1,2}\\-\\d{1,2}$";
  private StringDate stringDate;

  @Override
  public void initialize(StringDate stringDate) {
    this.stringDate = stringDate;
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
    boolean require = stringDate.require();
    if (require) {
      if (StringUtils.isEmpty(value)) {
        return false;
      }
      Pattern pattern = Pattern.compile(regx);
      Matcher matcher = pattern.matcher(value.trim());
      return matcher.find();
    } else {
      if (!StringUtils.isEmpty(value)) {
        Pattern pattern = Pattern.compile(regx);
        Matcher matcher = pattern.matcher(value.trim());
        return matcher.find();
      }
      return true;
    }
  }
}

第三步,在我们的VO上加上我们的自定义Validate

package org.lark.be.advance.bean.vo;


import lombok.Builder;
import lombok.Data;

import org.lark.framework.valid.date.StringDate;

/**
 * Created by zhaoqiang on 19-4-15
 */
@Data
public class VenueAdvQueryVO {

  @StringDate(message = "开始时间格式不正确")
  private String beginDate;
  @StringDate(message = "结束时间格式不正确")
  private String endDate;


}

第四步,在我们使用VO的接口加上「@Valid」表示对VO进行数据格式校验

注:下面代码只为配合演示。

@GetMapping
  public Map<String, Object> findAll(
      @Valid VenueAdvQueryVO venueAdvQueryVO
  ) {
    return null;
  }

第五步,啥,没有第五步了,自己去测试验证接口吧。