参数校验—自定义参数校验方法

自定义参数校验方法

使用 script

@ScriptAssert(
    script = "com.pinlor.web.request.config.AddConfigRequest.checkAGreaterEqualB(_this.shippingFee,_this.shippingFeeDiscount)",
    lang = "javascript", message = "配送费金额不可小于配送费减免金额!")
@Getter
@Setter
public class AddConfigRequest extends ApiRequest {
    /**
     * 配置名称
     */
    @NotBlank
    private String pageConfName;
    /**
     * 公告信息
     */
    @NotBlank
    private String bulletinBoard;
    /**
     * 配送时效
     */
    @NotBlank
    private String shippingTimely;
    /**
     * 配送费金额
     */
    @NotNull
    @Min(0)
    private BigDecimal shippingFee;
    /**
     * 配送费减免金额
     */
    @NotNull
    private BigDecimal shippingFeeDiscount;
    @NotNull
    private Long createBy;
    private Date createDate;
    @NotNull
    private Long updateBy;
    private Date updateDate;
    /**
     * num1 不可小于 num2
     *
     * @param num1
     * @param num2
     * @return
     */
    public static boolean checkAGreaterEqualB(BigDecimal num1, BigDecimal num2) {
        return num1.compareTo(num2) >= 0;
    }
}

使用 @Pattern

可以往里面放一个正则表达式,只能作用在字符串上,规定内容必须符合一定正则表达式。

@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是英文字母!")

自定义校验注解

在想用的地方加上注解就行。

新建自定义注解

import com.chw.common.validator.constraint.ListValueConstraintValidator;
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;
/**
 * The interface List value.
 *
 * @author CHW
 * @date 2023.06.04 18:21:24
 */
@Documented
// validatedBy 可以指定多个,目前只指定了一个校验 Integer 的。
// 会根据参数类型自动适配校验器
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
  /**
   * Message string.
   *
   * @return the string
   */
  String message() default "{com.chw.common.annotation.ListValue.message}";
  /**
   * Groups class [ ].
   *
   * @return the class [ ]
   */
  Class<?>[] groups() default {};
  /**
   * Payload class [ ].
   *
   * @return the class [ ]
   */
  Class<? extends Payload>[] payload() default {};
  /**
   * Values int [ ].
   *
   * @return the int [ ]
   */
  int[] values() default {};
}

自定义校验器

import com.chw.common.annotation.ListValue;
import java.util.HashSet;
import java.util.Set;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.ArrayUtils;
/**
 * The type List value constraint validator.
 *
 * @author CHW
 * @date 2023.06.04 18:24:35
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
  private final Set<Integer> legalValueSet = new HashSet<>();
  /**
   * 初始化方法
   *
   * @param constraintAnnotation the constraint annotation
   */
  @Override
  public void initialize(ListValue constraintAnnotation) {
    int[] values = constraintAnnotation.values();
    if (ArrayUtils.isNotEmpty(values)) {
      for (int value : values) {
        legalValueSet.add(value);
      }
    }
  }
  /**
   * 判断入参value是否通过校验
   *
   * @param value                      the value
   * @param constraintValidatorContext the constraint validator context
   * @return the boolean
   */
  @Override
  public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
    return legalValueSet.contains(value);
  }
}

新建 ValidationMessages.properties文件

com.chw.common.annotation.ListValue.message = 必须提交指定的值
  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的自定义注解是一种给代码提供额外信息的方式,可以在运行时通过反射机制获取注解的信息。通过自定义注解,我们可以实现参数校验,提高代码的健壮性和可维护性。 首先,我们需要定义一个注解类,用于定义参数校验的规则。比如,我们可以定义一个注解叫做@ParamCheck,用于对方法参数进行校验。 ```java @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface ParamCheck { String value(); } ``` 接着,在需要进行参数校验方法上使用@ParamCheck注解,并给注解传入校验规则的表达式。比如,我们可以给一个名为checkNumber的方法参数添加校验注解。 ```java public void checkNumber(@ParamCheck("number > 0") int number) { // ... } ``` 然后,在方法内部,通过反射机制获取参数的注解信息,并根据注解中定义的校验规则对参数进行校验。 ```java public void checkNumber(int number) { Parameter parameter = ...; // 获取方法参数信息 ParamCheck paramCheckAnnotation = parameter.getAnnotation(ParamCheck.class); if (paramCheckAnnotation != null) { String expression = paramCheckAnnotation.value(); // 根据expression对number进行校验 // ... } } ``` 最后,我们可以在调用checkNumber方法时传入一个不满足校验规则的参数,比如-10,当方法内部进行参数校验时,可以捕获到校验失败的情况,并进行相应处理。 ```java checkNumber(-10); // 参数校验失败,抛出异常或者进行其他处理 ``` 通过自定义注解实现参数校验可以方便地对代码进行统一的校验规则管理,提高代码的可维护性和可读性。同时,由于注解是在运行时通过反射获取,可以对代码进行动态改变和扩展,使得我们可以更加灵活地进行参数校验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值