spring - mvc - @Valid

dkpp發表於2024-03-09

自定義驗證
建立自定義驗證器需要推出我們自己的註釋並在我們的模型中使用它來強制執行驗證規則。
因此,讓我們建立自定義驗證器來檢查電話號碼。電話號碼必須是至少 8 位數字,但不超過 11 位數字。

1.新註釋

讓我們建立一個新的@interface 來定義我們的註釋:

@Documented
@Constraint(validatedBy = ContactNumberValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ContactNumberConstraint {
    String message() default "Invalid phone number";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

使用@Constraint註釋,我們定義了將驗證我們的欄位的類。message ()是顯示在使用者介面中的錯誤訊息。最後,附加程式碼大部分是樣板程式碼,以符合 Spring 標準。

2.建立驗證器

現在讓我們建立一個驗證器類來強制執行驗證規則:

public class ContactNumberValidator implements 
  ConstraintValidator<ContactNumberConstraint, String> {

    @Override
    public void initialize(ContactNumberConstraint contactNumber) {
    }

    @Override
    public boolean isValid(String contactField,
      ConstraintValidatorContext cxt) {
        return contactField != null && contactField.matches("[0-9]+")
          && (contactField.length() > 8) && (contactField.length() < 14);
    }

}

驗證類實現ConstraintValidator介面,還必須實現isValid方法;我們在這個方法中定義了驗證規則。
當然,我們在這裡使用一個簡單的驗證規則來展示驗證器的工作原理。
ConstraintValidator定義驗證給定物件的給定約束的邏輯。實施必須遵守以下限制:
物件必須解析為非引數化型別
物件的泛型引數必須是無界萬用字元型別

3.應用驗證註釋

在我們的例子中,我們建立了一個簡單的類,其中有一個欄位來應用驗證規則。在這裡,我們設定要驗證的帶註釋的欄位:

@ContactNumberConstraint
private String phone;

我們定義了一個字串欄位並使用自定義註釋@ContactNumberConstraint對其進行註釋。在我們的控制器中,我們建立了對映並處理了任何錯誤:

@Controller
public class ValidatedPhoneController {
 
    @GetMapping("/validatePhone")
    public String loadFormPage(Model m) {
        m.addAttribute("validatedPhone", new ValidatedPhone());
        return "phoneHome";
    }
    
    @PostMapping("/addValidatePhone")
    public String submitForm(@Valid ValidatedPhone validatedPhone,
      BindingResult result, Model m) {
        if(result.hasErrors()) {
            return "phoneHome";
        }
        m.addAttribute("message", "Successfully saved phone: "
          + validatedPhone.toString());
        return "phoneHome";
    }   
}

我們定義了這個具有單個JSP頁面的簡單控制器,並使用SubmitForm方法來強制驗證我們的電話號碼。

相關文章