Skip to content
This repository has been archived by the owner on Jan 9, 2021. It is now read-only.

YMP框架验证模块使用详解

suninformation edited this page Jul 25, 2013 · 1 revision

验证模块使用详解

如何声明参数验证规则?

验证规则声明采用Annotation注解方式,支持方法和实体类成员的验证规则声明,实例代码如下:

  • 方法参数声明:

      @Validation(fullMode=true)
      public void setUserName(
              @Validate({
                  @ValidateRule(RequriedValidator.NAME),
                  @ValidateRule(value = LengthValidator.NAME, params = { "min=6", "max=16" }) })
              String username) throws Exception {
          // TODO
      }
    
  • 类成员声明:

      @Validation
      public static class ValidationDemo {
      
          @Validate({
              @ValidateRule(RequriedValidator.NAME),
              @ValidateRule(value = LengthValidator.NAME, params = { "min=6", "max=16" }) })
          private String userName;
          
          public String getUserName() {
              return userName;
          }
          
          public void setUserName(String userName) throws Exception {
              this.userName = userName;
          }
      }
    

上述代码中,@Validation注解用于设置验证模式,参数fullMode的默认值为false,若fullMode=true则对目标验证对象内属性进行全部验证,否则直到出现第一个验证未通过就返回验证结果;

每个方法参数或类成员可以通过@Validate注解设置多个验证器,按验证器的先后顺序执行,@Validate注解有三个参数:

  • value:验证规则(@ValidateRule)配置集合;
  • name:自定义字段参数名称,若为空则默认采用参数变量名或成员属性名称;
  • isModel:目标对象是否为JavaBean对象;

验证器由@ValidateRule注解进行声明,它有三个参数:

  • value:验证器名称;
  • params:验证器参数集合;
  • message:错误提示信息模板;

如何执行参数验证?

  • 执行方法参数验证:

      // 获取类方法对象....
      Method _setMethod = ......;
      // 提取方法参数验证规则
      PairObject<Validation, Map<String, ValidateRule[]>> _rules = 
                  Validates.loadValidateRule(_setMethod, new String[] { "userName" });
      // 执行
      Set<ValidateResult> _results = Validates.execute(_rules.getKey(), _rules.getValue(), new String[] { "suninformation" });
    
  • 提取类成员验证规则:

      // 获取类方法对象....
      ValidationDemo _targetObj = new ValidationDemo();
      // 提取方法参数验证规则
      PairObject<Validation, Map<String, ValidateRule[]>> _rules = 
                  Validates.loadValidateRule(_targetObj, new String[] { "userName" });
      // 执行
      Set<ValidateResult> _results = Validates.execute(_rules.getKey(), _rules.getValue(), new String[] { "suninformation" });
    

默认支持哪些验证器?

目前模块提供以下验证器:

  • RequriedValidator:非空参数验证器;
  • RegexValidator:正则表达式验证器;
  • EmailValidator:有效电子邮件验证器;
  • LengthValidator:字符串长度验证;
  • DateValidator:日期类型参数验证;
  • NumericValidator:数值类型参数验证;
  • CompareValidator:参数值比较验证;

如何自定义验证器?

  • STEP 1:通过实现IValidator接口或继承AbstractValidator类实现自定义验证器,代码如下:

    • 基于AbstractValidator抽象类实现:

        public class TestValidator extends AbstractValidator {
        
            public static final String NAME = "test";
            
            public String getName() {
                return NAME;
            }
            
            protected String onValidate(IValidateContext context) {
                // ......普通参数对象验证处理过程,返回null表示验证通过,否则返回具体错误信息
                return null;
            }
            
            protected String onValidateArray(IValidateContext context, Class<?> arrayClassType) {
                // ......数组类型参数对象验证处理过程,返回null表示验证通过,否则返回具体错误信息
                return null;
            }
        
        }
      

      AbstractValidator抽象类集成了I18N,可加载国际化资源做为返回值,同时将普通参数类型与数组类型的验证方法抽象出来,由子类实现;

    • 基于IValidator接口实现:

        public class TestValidator implements IValidator {
        
            public static final String NAME = "test";
      
            // 这个方法返回的名称是用于验证器注册
            public String getName() {
                return NAME;
            }
            // 参数对象验证处理过程
            public String validate(IValidateContext context) {
                return null;
            }
      
        }
      

    每个验证器实现类都提供了一个常量NAME,只是为了方便引用,因为验证规则设置是通过名称来指定验证器的;

  • STEP 2:注册自定义验证器,代码如下:

      Validates.registerValidatorClass(TestValidator.class);
    

    使用方法:

      @Validate({ @ValidateRule(TestValidator.NAME) })