我有一個 NumberConstraint 如下:
@Constraint(validatedBy = { StringConstraintValidator.class, })
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, })
public @interface StringConstraint {
String message() default "'${validatedValue}' ist not valid Number. "
"A String is composed of 7 characters (digits and capital letters). Valid example: WBAVD13.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
并由 StringConstraintValidator 驗證如下:
@Component
public class StringConstraintValidator implements ConstraintValidator<StringConstraint, String> {
private static final String REGEX_String = "^[A-Z0-9]{7}$";
@Override
public void initialize(final StringConstraint annotation) {
// noop
}
@Override
public boolean isValid(final String value, final ConstraintValidatorContext context) {
return isValid(value);
}
public boolean isValid(final String value) {
// Number is not always null Checked via @NotNull
LoggingContext.get().setString(value);
if (value == null) {
return false;
}
return Pattern.compile(REGEX_STRING).matcher(value).matches();
}
}
我可以將此 StringConstraint 應用于請求物件的單個欄位,如下所示:
@StringConstraint
private String number;
但是如果我的請求物件包含一個字串串列,那么我如何在整個串列上使用這個約束,還是我必須在串列型別上定義新的?就像是ConstraintValidator<StringConstraint, List ???>
我的請求物件是:
@JsonProperty(value = "items", required = true)
@Schema(description = "List of items.", required = true)
private List<String> items= new ArrayList<>();
所以我想對串列中的所有字串應用我的驗證器。我如何申請@StringConstraint我的名單?
uj5u.com熱心網友回復:
是的,您可以通過在注釋的validatedBy屬性中使用逗號分隔的驗證器類串列來為一個約束添加更多驗證器。@Constraint例如,您可以撰寫:
@Constraint(validatedBy = {StringConstraintValidator.class, BlablaValidot.class})
public @interface MyConstraint {
// other attributes
}
解釋
@Constraint注解用于定義可應用于欄位、方法、類等的自定義約束注解。屬性validatedBy指定一個或多個實作ConstraintValidator介面并提供驗證被注解元素的邏輯的類。如果要檢查值的不同方面或條件,可以對同一約束使用多個驗證器。例如,您可以有一個檢查字串長度的驗證器和另一個檢查字串格式的驗證器。
例子
以下是具有多個驗證器的自定義約束注釋的一些示例:
@PhoneNumber使用兩個驗證器驗證電話號碼的注釋:一個用于國家代碼,一個用于數字格式。
@Constraint(validatedBy = {CountryCodeValidator.class, PhoneNumberValidator.class})
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface PhoneNumber {
String message() default "Invalid phone number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 使用三個驗證器驗證密碼的
@Password注釋:一個用于最小長度,一個用于最大長度,一個用于特殊字符的存在。
@Constraint(validatedBy = {MinLengthValidator.class, MaxLengthValidator.class, SpecialCharValidator.class})
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Password {
String message() default "Invalid password";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int minLength() default 8;
int maxLength() default 20;
String specialChars() default "!@#$%^&*";
}
uj5u.com熱心網友回復:
Java 中的自定義驗證器是一種定義您自己的規則來驗證物件或引數的資料的方法。您可以使用 javax.validation API 創建和使用自定義驗證器。API 由兩個主要組件組成:注釋和驗證器。
注釋用于宣告要應用于資料的約束。它們通常放置在您要驗證的欄位或引數上。您可以使用 API 提供的內置注解,例如@NotNull、@Size、@Pattern 等,也可以為您的自定義約束定義自己的注解。
驗證器是實作 ConstraintValidator 介面并提供用于根據約束驗證資料的邏輯的類。該介面有兩個泛型引數:A 是注解型別,T 是資料型別。該介面有兩個方法:initialize 和 isValid。initialize 方法用于初始化帶有注解屬性的驗證器,isValid 方法用于根據注解檢查資料是否有效。
要為串列型別創建自定義驗證器,您需要將串列型別指定為 ConstraintValidator 介面的第二個泛型引數,并實作 isValid 方法來迭代串列元素并單獨驗證它們。您可以使用任何適合您需要的邏輯,例如檢查元素的長度、格式、范圍等。您還可以在自定義驗證器中使用其他注釋或驗證器來重用現有的驗證規則。
例子
下面是一個示例,說明如何為字串串列創建自定義驗證器,以檢查每個元素是否為有效數字。
定義注釋
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = StringConstraintValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface NumberConstraint {
String message() default "Invalid number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
定義驗證器
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.List;
public class StringConstraintValidator implements ConstraintValidator<NumberConstraint, List<String>> {
@Override
public void initialize(NumberConstraint constraintAnnotation) {
// You can use this method to initialize the validator with the annotation attributes
}
@Override
public boolean isValid(List<String> value, ConstraintValidatorContext context) {
// You can use this method to validate the list elements
if (value == null || value.isEmpty()) {
return true; // You can change this to false if you want to reject null or empty lists
}
for (String s : value) {
try {
Double.parseDouble(s); // Try to parse the string as a double
} catch (NumberFormatException e) {
return false; // If the string is not a valid number, return false
}
}
return true; // If all the strings are valid numbers, return true
}
}
應用注釋
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
public class Request {
@NotNull
@NumberConstraint
private List<String> numbers;
// Constructor, getters, setters, etc.
}
public class Controller {
public void processRequest(@Valid Request request) {
// Do something with the request
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522033.html
