自訂驗證器


寫程式碼前先了解一個新的註解@Validator,它的作用是宣告一個類別為驗證器,它的參數需要綁定自訂驗證器對應的註解,這個註解的作用與@VRequried等註解是一樣的,開發人員可以透過該註解配置驗證規則;

本例中,我們建立一個簡單的自訂驗證器,用來驗證目前使用者輸入的郵件地址是否已存在;

  • 建立自訂驗證器註解:

    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface VEmailCanUse {
    
        /**
         * @return 自定义验证消息
         */
        String msg() default "";
    }
  • ##實作IValidator介面並宣告@Validator註解:

    @Validator(VEmailCanUse.class)
    public class EmailCanUseValidator implements IValidator {
    
        public ValidateResult validate(ValidateContext context) {
            ValidateResult _result = null;
            if (context.getParamValue() != null) {
                // 假定邮箱地址已存在
                VEmailCanUse _anno = (VEmailCanUse) context.getAnnotation();
                _result = new ValidateResult(context.getParamName(), StringUtils.defaultIfBlank(_anno.msg(), "邮箱地址已存在"));
            }
            return _result;
        }
    }
  • ##測試程式碼:
  • #
    public class VEmailCanUseBean {
    
        @VRequried
        @VEmail
        @VEmailCanUse
        private String email;
    
        //
        // 此处省略了Get/Set方法
        //
    }
    
    public static void main(String[] args) throws Exception {
        YMP.get().init();
        try {
            Map<String, Object> _params = new HashMap<String, Object>();
            _params.put("ext.email", "demo@163.com");
    
            Map<String, ValidateResult> _results = Validations.get().validate(VEmailCanUseBean.class, _params);
            //
            for (Map.Entry<String, ValidateResult> _entry : _results.entrySet()) {
                System.out.println(_entry.getKey() + " : " + _entry.getValue().getMsg());
            }
        } finally {
            YMP.get().destroy();
        }
    }
  • 執行結果:
  • ext.email : 邮箱地址已存在
###