spring - mvc - @Valid

自定义验证
创建自定义验证器需要推出我们自己的注释并在我们的模型中使用它来强制执行验证规则。
因此,让我们创建自定义验证器来检查电话号码。电话号码必须是至少 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方法来强制验证我们的电话号码。

posted @ 2024-03-09 11:03  dkpp  阅读(5)  评论(0编辑  收藏  举报