3个注解搞定参数及接口版本校验

使用方式:

  1. 1.controller层加上
  2.  
  3.  校验参数
  4.     //注册保存的校验组:VGroup.save
  5.     @Validator(bean=Register.class,group=VGroup.save)
  6.     //注册发送短信时校验组:VGroup.excutor
  7.     @Validator(bean=Register.class,group=VGroup.excutor)
  8.  
  9.  校验接口版本号
  10.     @Version(version=1,message="请升级到最新版本")
  11.  
  12. 2.配置拦截器:
  13.     @Override
  14.     public void onInterceptorConfig(Interceptors interceptors) {
  15.         interceptors.add(new ValidatorInterceptor());
  16.     }
  17.  
  18. 3.在不同的实体类上配置校验规则:
  19.     @VRules(rules={
  20.         @VRule(attrName = "mobilePhone", message="手机号码有误", groups = { VGroup.save,VGroup.excutor },  types = { VType.mobilePhone } ),
  21.         @VRule(attrName = "password", message="密码最少为6位字符",  groups = { VGroup.save },  types = { VType.password } ),
  22.         @VRule(attrName = "verifyCode", message="验证码有误",  groups = { VGroup.excutor },  types = { VType.number } ),
  23.         @VRule(attrName = "messageId", message="验证码标识有误",  groups = { VGroup.excutor },  types = { VType.notnull } )
  24.     })
  25.     public class Register implements Serializable{}


具体实现:

  1. /**
  2.  * ------------------------------
  3.  * 数据验证规则
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年5月30日
  6.  * @version 1.0
  7.  */
  8. public interface IVRule {
  9.     /**
  10.      * 校验规则
  11.      */
  12.     public static final Map<String,List<ValidatorRule>> BEAN_VALIDATOT_RULE=new HashMap<String,List<ValidatorRule>>();
  13.     /**
  14.      * 是否初始化校验规则
  15.      */
  16.     public static final Map<String,Boolean> IS_INIT_VALIDATOT_RULE=new HashMap<String,Boolean>();
  17. }
  18. /**<pre>
  19.  * ------------------------------
  20.  * 用于controller层需要验证数据较多时的验证
  21.  * 默认VGroup=VGroup.excutor
  22.  * 默认VRenderType=VRenderType.json
  23.  * ------------------------------
  24.  * </pre>
  25.  * @author wdm(l311576@sina.com)  @date 2018年5月30日
  26.  * @version 1.0
  27.  */
  28. @Documented
  29. @Target(ElementType.METHOD)
  30. @Inherited
  31. @Retention(RetentionPolicy.RUNTIME)
  32. public @interface Validator {
  33.     VGroup group() default VGroup.excutor;
  34.     Class<?> bean();
  35.     String beanName() default "";
  36.     String uri() default "";
  37.     VRenderType render()  default VRenderType.json;
  38. }
  1. /**
  2.  * ------------------------------
  3.  * 用于controller层验证版本号
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年5月30日
  6.  * @version 1.0
  7.  */
  8. @Documented
  9. @Target(ElementType.METHOD)
  10. @Inherited
  11. @Retention(RetentionPolicy.RUNTIME)
  12. public @interface Version {
  13.     String message();
  14.     int version();
  15. }
  1. package com.www.mall.common.validator;
  2.  
  3. public enum VRenderType {
  4.     json,redirect,render
  5. }
  1. /**
  2.  * ------------------------------
  3.  * 配置一条校验规则
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年7月31日
  6.  * @version 1.0
  7.  */
  8. @Documented
  9. @Target(ElementType.METHOD)
  10. @Inherited
  11. @Retention(RetentionPolicy.RUNTIME)
  12. public @interface VRule {
  13.     VGroup[] groups() default {VGroup.excutor};
  14.     VType[] types();
  15.     String attrName();
  16.     String message() default "参数错误";
  17. }
  1. /**
  2.  * ------------------------------
  3.  * 校验规则
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年7月31日
  6.  * @version 1.0
  7.  */
  8. @Documented
  9. @Target(ElementType.TYPE)
  10. @Inherited
  11. @Retention(RetentionPolicy.RUNTIME)
  12. public @interface VRules {
  13.     VRule[] rules();
  14. }
  1. /**
  2.  * ------------------------------
  3.  * 验证数据类型
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年5月30日
  6.  * @version 1.0
  7.  */
  8. public enum VType {
  9.     /**非空验证**/
  10.     notnull,
  11.     /**非空时验证电子邮箱格式,空表示通过**/
  12.     ne_email,
  13.     /**非空时验证身份证格式,空表示通过**/    
  14.     ne_idcard,
  15.     
  16.     /**验证电子邮箱格式**/
  17.     email,
  18.     /**验证身份证格式**/    
  19.     idcard,
  20.     /**验证日期格式**/    
  21.     date,
  22.     /***手机号验证***/
  23.     mobilePhone,
  24.     /***密码验证***/
  25.     password,    
  26.     /***数字验证***/
  27.     number
  28. }
  1. /**
  2.  * ------------------------------
  3.  * 验证数据规则
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年5月30日
  6.  * @version 1.0
  7.  */
  8. public class ValidatorRule {
  9.  
  10.     private List<VGroup> vGroups;
  11.     private List<VType> vTypes;
  12.     private String validatorField;
  13.     private String message;
  14.     
  15.     /**
  16.      * 构建一个数据验证规则
  17.      * @param validatorField
  18.      * @param message
  19.      * @param vGroups
  20.      * @param vTypes
  21.      * @return
  22.      */
  23.     public static ValidatorRule bulid(String validatorField,String message,List<VGroup> vGroups,List<VType> vTypes){
  24.         return new ValidatorRule(vGroups,vTypes,validatorField,message);
  25.     }
  26.     
  27.     /**
  28.      * 都需要验证的数据
  29.      * 如:save和update操作时都需要验证这个参数
  30.      * @param validatorGroups
  31.      * @return
  32.      */
  33.     public static List<VGroup> group(VGroup... validatorGroups){
  34.         List<VGroup> list=new ArrayList<VGroup>();
  35.         for (int i = 0; i < validatorGroups.length; i++) {
  36.             list.add(validatorGroups[i]);
  37.         }
  38.         return list;
  39.     }
  40.     
  41.     /**
  42.      * 数据的验证类型
  43.      * @param validatorTypes
  44.      * @return
  45.      */
  46.     public static List<VType> type(VType... validatorTypes){
  47.         List<VType> list=new ArrayList<VType>();
  48.         for (int i = 0; i < validatorTypes.length; i++) {
  49.             list.add(validatorTypes[i]);
  50.         }
  51.         return list;
  52.     }
  53.     
  54.     private ValidatorRule(){}
  55.     private ValidatorRule(List<VGroup> vGroups, List<VType> vTypes, String validatorField,
  56.             String message) {
  57.         super();
  58.         this.vGroups = vGroups;
  59.         this.vTypes = vTypes;
  60.         this.validatorField = validatorField;
  61.         this.message = message;
  62.     }
  63.  
  64.     public List<VGroup> getValidatorGroups() {
  65.         return vGroups;
  66.     }
  67.     public void setValidatorGroups(List<VGroup> vGroups) {
  68.         this.vGroups = vGroups;
  69.     }
  70.     public List<VType> getValidatorTypes() {
  71.         return vTypes;
  72.     }
  73.     public void setValidatorTypes(List<VType> vTypes) {
  74.         this.vTypes = vTypes;
  75.     }
  76.     public String getValidatorField() {
  77.         return validatorField;
  78.     }
  79.     public void setValidatorField(String validatorField) {
  80.         this.validatorField = validatorField;
  81.     }
  82.     public String getMessage() {
  83.         return message;
  84.     }
  85.     public void setMessage(String message) {
  86.         this.message = message;
  87.     }
  88.     
  89. }

数据校验拦截器

  1. /**
  2.  * ------------------------------
  3.  * 参数验证拦截器
  4.  * ------------------------------
  5.  * @author wdm(l311576@sina.com)  @date 2018年5月31日
  6.  * @version 1.0
  7.  */
  8. public class ValidatorInterceptor implements Interceptor {
  9.     
  10.     @Override
  11.     public void intercept(Invocation inv) {
  12.         Version version=inv.getMethod().getAnnotation(Version.class);
  13.         if(version!=null && !verifyVersion(inv, version)){
  14.             return;
  15.         }
  16.         
  17.         Validator validator = inv.getMethod().getAnnotation(Validator.class);
  18.         if (validator != null && !validate(inv, validator)) {
  19.             return;
  20.         }
  21.         inv.invoke();
  22.     }
  23.     
  24.     private boolean verifyVersion(Invocation inv, Version version) {
  25.         int vers=version.version();
  26.         String message=StringUtils.isBlank(version.message())?"该功能已升级,如要继续使用请升级app到最新版本":version.message();
  27.         Controller controller=inv.getController();
  28.         
  29.         if(vers>-1){
  30.             int verifyVersion = -1;
  31.             String versionStr= controller.getHeader("version");//验证版本号
  32.             if(versionStr!=null){
  33.                 try {
  34.                     verifyVersion=Integer.valueOf(versionStr);
  35.                 } catch (Exception e) {
  36.                     //版本信息错误  必须是int类型数字
  37.                     e.printStackTrace();
  38.                 }
  39.             }
  40.             
  41.             if(verifyVersion<vers){
  42.                 renderError( controller,VRenderType.json, "" ,RC.VERSION_FAIL,message);
  43.                 return false;
  44.             }
  45.             
  46.         }
  47.         return true;
  48.     }
  49.  
  50.     /**
  51.      * 验证JSON格式的数据
  52.      * @param inv
  53.      * @param validator
  54.      * @return
  55.      */
  56.     private boolean validate(Invocation inv, Validator validator) {
  57.         VRenderType vRenderType=validator.render();
  58.         VGroup group = validator.group();
  59.         Controller controller=inv.getController();
  60.         Class<?> clazz=validator.bean();
  61.         String validatorBeanName=clazz.getName();
  62.  
  63.         //初始化校验规则
  64.         initValidatorRule(validatorBeanName, clazz);
  65.         List<ValidatorRule>  list=IVRule.BEAN_VALIDATOT_RULE.get(validatorBeanName);
  66.         
  67.         if (list==null) {//没有验证规则
  68.             return true;
  69.         }
  70.         
  71.         JSONObject jsonObject= json(controller.getPara("param"),controller.getHeader("ploy"));
  72.         String beanName=validator.beanName()+".";
  73.         for (int i = 0; i < list.size(); i++) {//循环每一条数据规则
  74.             ValidatorRule validatorRule=list.get(i);
  75.             List<VGroup> groups = validatorRule.getValidatorGroups();
  76.             if(groups.contains(group)){//包含分组-需要验证该组数据
  77.                 String field=beanName+validatorRule.getValidatorField(); 
  78.                 String message=validatorRule.getMessage();
  79.                 List<VType> validatorRules=validatorRule.getValidatorTypes();
  80.                 for (int j = 0; j < validatorRules.size(); j++) {
  81.                     VType vType=validatorRules.get(j);
  82.                     
  83.                     String value =jsonObject==null ?null : jsonObject.getString(field);//controller.getPara(field);
  84.                     
  85.                     if(!validate(vType,value)){
  86.                         renderError(controller,vRenderType, validator.uri(),RC.PARAM_FAIL,message);
  87.                         return false;
  88.                     }
  89.                 }
  90.             }
  91.         }
  92.         return true;
  93.     }
  94.     
  95.     /**
  96.      * 初始化验证规则
  97.      * @param isInit
  98.      * @param bean
  99.      */
  100.     private void initValidatorRule(String validatorBeanName,Class<?> clazz) {
  101.         Boolean isInit=IVRule.IS_INIT_VALIDATOT_RULE.get(validatorBeanName);
  102.         if(isInit!=null && isInit){//是否已经初始化
  103.             return;
  104.         }
  105.         VRules vRules=clazz.getAnnotation(VRules.class);
  106.         if(vRules!=null){
  107.             VRule[] rules=vRules.rules();
  108.             if(rules.length>0){
  109.                 List<ValidatorRule> validatorRules=new ArrayList<ValidatorRule>();
  110.                 for (int i = 0; i < rules.length; i++) {
  111.                     VRule vRule=rules[i];
  112.                     String attrName=vRule.attrName();
  113.                     String message=vRule.message();
  114.                     VGroup[]  validatorGroups=vRule.groups();
  115.                     VType[] validatorTypes=vRule.types();
  116.                     validatorRules.add(ValidatorRule.bulid( attrName, message,ValidatorRule.group(validatorGroups), ValidatorRule.type(validatorTypes)));
  117.                 }
  118.                 IVRule.BEAN_VALIDATOT_RULE.put(validatorBeanName, validatorRules);
  119.             }
  120.         }
  121.         IVRule.IS_INIT_VALIDATOT_RULE.put(validatorBeanName,true);
  122.     }
  123.  
  124.     protected JSONObject json(String json,String ploy){
  125.         if(Ploy.ENCRYPT.equals(ploy)){//参数解密
  126.             json=ParamUtil.decryptParam(json);
  127.             if(json==null){
  128.                 return null;
  129.             }
  130.         }
  131.         return JSON.parseObject(json);
  132.     }
  133.     
  134.     /**
  135.      * 有需要再追加
  136.      * @param vType
  137.      * @param value
  138.      * @return
  139.      */
  140.     private boolean validate(VType vType, String value) {
  141.         if(vType==VType.notnull){
  142.             return com.xiaoleilu.hutool.lang.Validator.isNotEmpty(value);
  143.         }else if(vType==VType.email){
  144.             return com.xiaoleilu.hutool.lang.Validator.isEmail(value);
  145.         }else if(vType==VType.idcard){
  146.             return IdcardUtil.isvalidCard18(value);
  147.         }else if(vType==VType.ne_email){
  148.             if( com.xiaoleilu.hutool.lang.Validator.isNotEmpty(value)){
  149.                 return true;
  150.             }
  151.             return RegexUtils.checkEmail(value);
  152.         }else if(vType==VType.ne_idcard){
  153.             if( com.xiaoleilu.hutool.lang.Validator.isNotEmpty(value)){
  154.                 return true;
  155.             }
  156.             return IdcardUtil.isvalidCard18(value);
  157.         }else if(vType==VType.mobilePhone){
  158.             return com.xiaoleilu.hutool.lang.Validator.isMobile(value) && value.length()==11;
  159.         }else if(vType==VType.password){
  160.             return value!=null && value.length()>5;
  161.         }else if(vType==VType.number){
  162.             return com.xiaoleilu.hutool.lang.Validator.isNumber(value);
  163.         }
  164.         
  165.         return true;
  166.     }
  167.  
  168.     private void renderError(Controller controller,VRenderType vRenderType, String redirect,RC result,String message) {
  169.         if (controller instanceof JbootController) {
  170.             if(vRenderType==VRenderType.json){
  171.                 controller.renderJson(Ret.paramFail(message));
  172.             }else if(vRenderType==VRenderType.redirect){
  173.                 if(StringUtils.isNotBlank(redirect)){
  174.                     controller.redirect(redirect);
  175.                 }
  176. //                 ((JbootController) controller).setFlashAttr("message", message);
  177. //                 ((JbootController) controller).setFlashAttr("result", result);
  178.                 controller.renderJson(Ret.result(result.getState(), message));
  179.             }else if(vRenderType==VRenderType.render){
  180.                 controller.keepPara();
  181.                 if(StringUtils.isNotBlank(redirect)){
  182.                     controller.render(redirect);
  183.                 }
  184. //                 ((JbootController) controller).setFlashAttr("message", message);
  185. //                 ((JbootController) controller).setFlashAttr("result", result);
  186.                 controller.renderJson(Ret.result(result.getState(), message));
  187.             }else{
  188.                 if(StringUtils.isNotBlank(redirect)){
  189.                     controller.redirect(redirect);
  190.                 }
  191.                 
  192. //                 ((JbootController) controller).setFlashAttr("message", message);
  193. //                 ((JbootController) controller).setFlashAttr("result", result);
  194.                 controller.renderJson(Ret.result(result.getState(), message));
  195.             }
  196.         }
  197.     }
  198.  
  199. }