用例:
讓我們假設這是我的 POJO:
class Sample{
String field1;
String field2;
double field3;
LocalDateTime field4;
LocalDateTime field5;
//...getters, setters and parameterised constructor
}
我正在從外部檔案中讀取某些值并使用引數化建構式創建 POJO。所有欄位都有一定的驗證約束。
我正在尋找的是一種在我使用引數化建構式創建物件時自動評估這些約束的方法。如果一個或多個驗證約束失敗,它應該拋出一個錯誤。
到目前為止我嘗試過的:
我通過創建自己的注釋和驗證器在 Spring 中嘗試了 Bean 驗證方法。代碼如下:
POJO
@ValidChecker(groups = Default.class)
class Sample{
String field1;
String field2;
double field3;
LocalDateTime field4;
LocalDateTime field5;
//...getters, setters and parameterised constructor
}
ValidChecker 注釋
@Constraint(validatedBy = DataValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidChecker {
String message() default "Data is not valid";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
資料驗證器.java
@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
public class DataValidator implements ConstraintValidator<ValidChecker, ValidationData> {
@Override
public void initialize(ValidChecker constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(ValidationData validationData, ConstraintValidatorContext constraintValidatorContext) {
if (validationData == null) {
return false;
}
if (BigDecimal.valueOf(validationData.getField3()).scale() != 2) {
return false;
}
if (validationData.getField5().isBefore(validationData.getField4())) {
return false;
}
return true;
}
}
上面的代碼不起作用。
需要的建議
- 上述方法的問題
- 使用 Spring 的替代方法
- 使用一些第三方庫的替代方法
我看了很多,但找不到沒有 Spring bean 驗證的方法。有人可以幫忙嗎?
uj5u.com熱心網友回復:
您可以直接在建構式中使用 Bean Validation API:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Sample>> violations = validator.validate(this);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349211.html
