正文:
在实际的应用开发中,我们经常需要对接口的输入进行校验,以确保数据的合法性。在Spring Boot项目中,通过使用Hibernate Validator等校验框架,可以轻松地实现各种校验需求。本文将介绍如何自定义一个注解@InIntValues
,并通过对应的校验器InIntValuesValidator
来实现对输入是否为指定可选int值的校验。
首先,我们创建一个自定义注解@InIntValues
,用于标记需要进行可选int值校验的字段或参数。以下是注解的定义:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 可选int值范围校验注解
*/
@Documented
@Constraint(validatedBy = InIntValuesValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface InIntValues {
// 默认错误提示信息
String message() default "必须是指定的int值之一";
// 可选的int值数组
int[] values();
// 分组
Class<?>[] groups() default {};
// 负载
Class<? extends Payload>[] payload() default {};
}
接下来,我们需要实现可选int值校验的逻辑。为此,创建一个InIntValuesValidator
类,实现ConstraintValidator<InIntValues, Integer>
接口:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
/**
* 可选int值范围校验器
*/
public class InIntValuesValidator implements ConstraintValidator<InIntValues, Integer> {
private int[] allowedValues;
@Override
public void initialize(InIntValues constraintAnnotation) {
this.allowedValues = constraintAnnotation.values();
}
/**
* 校验方法
* @param value 待校验的整数
* @param context 校验上下文
* @return 校验结果,true表示通过,false表示不通过
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
// 如果值为null,由 @NotNull 校验
if (value == null) {
return true;
}
// 判断值是否在可选的int值数组中
return Arrays.stream(allowedValues).anyMatch(val -> val == value);
}
}
在这个校验器中,我们使用@InIntValues
注解的values()
属性来指定可选的int值数组。在isValid
方法中,我们使用Java 8的Stream API来判断被验证的值是否在这个可选的int值数组中。
现在,你可以在需要进行可选int值校验的字段上应用@InIntValues
注解:
public class YourRequestDTO {
@NotBlank(message = "姓名不能为空")
@Chinese
private String name;
@InIntValues(values = {1, 2, 3}, message = "必须是指定的int值之一")
private Integer selectedValue;
// 其他字段...
}
在这个例子中,selectedValue
字段通过@InIntValues
注解进行了可选int值校验。当请求中的selectedValue
字段不是指定的可选int值之一时,将触发校验错误,并返回指定的错误提示信息。
通过这样的自定义注解和校验器,你可以在Spring Boot项目中轻松实现对字段值是否为指定可选int值的校验,提高系统的数据质量和安全性。