1. 程式人生 > 程式設計 >Java Validation Api如何實現自定義註解

Java Validation Api如何實現自定義註解

背景

官方提供的註解多數可以解決現實業務場景中基本業務校驗,但有些特殊場景因業務的複雜性,也還是需要在入口處對入參進行各種角度的校驗,以求簡化業務層的處理,降低業務處理複雜性與方法入口的強約束性。 以上背景,下面就舉個簡單Demo進行自定義註解校驗的實現。

註解定義類

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

/**
 * @author wpp
 * @date 2020/8/22 14:30
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneCustomizeValidator.class)
public @interface CustomizeValidator {

  String message() default "不是國內手機號";

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

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

}

註解方法處理類

import cn.hutool.core.util.StrUtil;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * @author wpp
 * @date 2020/8/22 14:33
 */
public class PhoneCustomizeValidator implements ConstraintValidator<CustomizeValidator,String> {

  private String phoneRegex = "^(16[0-9]|19[0-9]|13[0-9]|15[012356789]|17[0-9]|18[0-9]|14[0-9])[0-9]{8}$";
  private Pattern phonePattern = Pattern.compile(phoneRegex);

  @Override
  public void initialize(CustomizeValidator constraintAnnotation) {

  }

  @Override
  public boolean isValid(String value,ConstraintValidatorContext context) {
    if (StrUtil.isBlank(value)) {
      return Boolean.FALSE;
    }
    return phonePattern.matcher(value).matches();
  }
}

使用方式

import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

/**
 * @author wpp
 * @date 2020/8/22 14:49
 */
@Data
@Builder
public class CustomizeDTO {

  @ApiModelProperty(name = "phone",value = "手機號碼")
  @Length(max = 13)
  private String phone;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。