後端HTTP請求參數驗證器服務ParamertValidateService

好處:方便了後端對HTTP請求中參數進行覈驗,只需一次編寫效驗器,一行代碼即可對全部參數的pojo進行參數覈驗!並且更改效驗邏輯時只須要更改效驗器類便可,實現瞭解耦合。java

只須要程序員按照規範開發一個ParameterValidator類(以下圖1),將全部效驗方法寫在該類中便可在任意地方使用一行代碼實現對全部參數的核驗(以下圖2)程序員

圖1:(圖中寫了對手機號碼和密碼進行覈驗的方法)後端

 

圖二:ide

 


Jar包:ParameterValidator.jarthis

url:http://xingxunxinxi.com/ParameterValidator.jarurl

項目結構:spa

com.xingxunxinxi.ParameterValidator包含該套參數驗證器服務的接口和默認實現類3d

HTTP請求參數驗證器服務接口:ParameterValidateServicecode

 1 package com.xingxunxinxi.ParameterValidator;
 2 
 3 /**   
 4  *    
 5  * 項目名稱:ParameterValidator   
 6  * 類名稱:    ParameterValidator   
 7  * 類描述:   ParameterValidateService interface
 8  * 建立人:    HumorChen   
 9  * 建立時間:2019年4月20日 下午7:48:51      
10  * 修改時間:2019年4月20日 下午7:48:51   
11  * 修改備註:   
12  *    
13  */
14 public interface ParameterValidateService {
15     String SUCCESS="SUCCESS";
16     public String validate(Object...objects)throws Exception;
17 }
View Code

默認實現類:DefaultParameterValidateServiceblog

  1 package com.xingxunxinxi.ParameterValidator;
  2 
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.Method;
  5 /**
  6  * 
  7 *    
  8 * 項目名稱:ParameterValidator   
  9 * 類名稱:    DefaultParameterValidateService   
 10 * 類描述:   DefaultParameterValidateService
 11 * 建立人:    HumorChen   
 12 * 建立時間:2019年4月20日 下午11:46:47      
 13 * 修改時間:2019年4月20日 下午11:46:47   
 14 * 修改備註:   
 15 *
 16  */
 17 public class DefaultParameterValidateService implements ParameterValidateService {
 18     //false means return first failure reason,true means return all reasons.
 19     private boolean AllResult=false;
 20     //whether inner-validator is initialized
 21     private boolean initialized=false;
 22     //inner validator object
 23     private Object validator;
 24     //exception message
 25     private static String notValidatorExceptionMessage="This object is not an instance of ParameterValidator";
 26     //separate reason
 27     public  static String ReasonSeparator="\n";
 28     public DefaultParameterValidateService()
 29     {
 30         
 31     }
 32     /**
 33      * parameter AllResult is true means return all fail reasons when validating,false means return the first failure reason
 34      * @param boolean
 35      */
 36     public DefaultParameterValidateService(boolean AllResult)
 37     {
 38         this.AllResult=AllResult;
 39     }
 40     /**
 41      * initialize the validator of ParameterValidatorService
 42      * @param class<?>
 43      * @throws Exception
 44      */
 45     public void init(Class<?>validatorclass) throws Exception
 46     {
 47         init(validatorclass.newInstance());
 48     }
 49     /**
 50      * initialize the validator of ParameterValidatorService
 51      * @param Object
 52      * @throws Exception
 53      */
 54     public void init(Object object) throws Exception
 55     {
 56         if(isValidator(object))
 57         {
 58             this.validator=object;
 59             initialized=true;
 60             System.out.println(this.getClass().getSimpleName()+" initialize success");
 61         }
 62     }
 63     /**
 64      * initialize the validator of ParameterValidatorService
 65      * @param String
 66      * @throws Exception
 67      */
 68     public void init(String classname) throws Exception
 69     {
 70         init(Class.forName(classname).newInstance());
 71     }
 72     /**
 73      * judge whether the object is a validator.
 74      * reference ParametorValidatorDemo
 75      * method-ruler:
 76      * method-name:your property name
 77      * returnType: String
 78      * parameterCount:1
 79      * parameterType:Object
 80      * @param object
 81      * @return boolean
 82      * @throws Exception
 83      */
 84     private boolean isValidator(Object object) throws Exception
 85     {
 86         for(Method method:object.getClass().getDeclaredMethods())
 87             if(method.getParameterCount()==1&&method.getReturnType().equals(String.class)&&method.getParameterTypes()[0].equals(Object.class))
 88                 return true;
 89             else
 90                 throw new Exception(notValidatorExceptionMessage);
 91         return false;
 92     }
 93     
 94     public static void setReasonSeparator(String reasonSeparator) {
 95         ReasonSeparator = reasonSeparator;
 96     }
 97     
 98     public boolean isAllResult() {
 99         return AllResult;
100     }
101     public void setAllResult(boolean allResult) {
102         AllResult = allResult;
103     }
104     /**
105      * validate objects' properties
106      * @param objects
107      * @return String:validate_result
108      */
109     public String validate(Object... objects) throws Exception {
110         if(initialized)
111         {
112             String result="";
113             for(Object object:objects)
114                 for(Field field:object.getClass().getDeclaredFields())
115                 {
116                     field.setAccessible(true);
117                     String fieldresult=(String) validator.getClass().getMethod(field.getName(), Object.class).invoke(validator, field.get(object));
118                     if(AllResult)
119                     {
120                         if(!fieldresult.equals(SUCCESS))
121                             result+=fieldresult+ReasonSeparator;
122                     }
123                     else
124                     {
125                         if(!fieldresult.equals(SUCCESS))
126                             return fieldresult;
127                     }
128                 }
129             return result==""?SUCCESS:result.substring(0, result.length()-ReasonSeparator.length());
130         }
131         else
132             throw new Exception("ParameterValidator not initialized Exception");
133     }
134 
135 }
View Code

示範包:

com.xingxunxinxi.ParameterValidator.Demo

示範參數驗證器類:

 1 package com.xingxunxinxi.ParameterValidator.Demo;
 2 
 3 import com.xingxunxinxi.ParameterValidator.ParameterValidateService;
 4 
 5 /**
 6  * 
 7 *    
 8 * 項目名稱:ParameterValidator   
 9 * 類名稱:    ParameterValidatorDemo   
10 * 類描述:    ParameterValidatorDemo
11 * 建立人:    HumorChen   
12 * 建立時間:2019年4月20日 下午10:07:27      
13 * 修改時間:2019年4月20日 下午10:07:27   
14 * 修改備註:   
15 *
16  */
17 public class ParameterValidatorDemo {
18     /**
19      * we use this method below to validate object's property which named phoneNumber,if phoneNumber's value is legal,this method will return
20      * ParameterValidateService.SUCCESS,or return your individual tip.
21      * @param object
22      * @return String
23      */
24     public String phoneNumber(Object object)
25     {
26         String result="illegal phone number";
27         String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
28         if(((String)object).matches(regex))
29             return ParameterValidateService.SUCCESS;
30         return result;
31     }
32     /**
33      * we use this method below to validate object's property which named password,if password's value is legal,this method will return
34      * ParameterValidateService.SUCCESS,or return your individual tip.
35      * @param object
36      * @return
37      */
38     public String password(Object object)
39     {
40         String result="illegal password";
41         String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$";
42         if(((String)object).matches(regex))
43             return ParameterValidateService.SUCCESS;
44         return result;
45     }
46 }
View Code

示範調用類:

 1 package com.xingxunxinxi.ParameterValidator.Demo;
 2 
 3 import com.xingxunxinxi.ParameterValidator.DefaultParameterValidateService;
 4 /**
 5  * 
 6 *    
 7 * 項目名稱:ParameterValidator   
 8 * 類名稱:    UseDemo   
 9 * 類描述:   DefaultParameterValidateService use demo
10 * 建立人:    HumorChen   
11 * 建立時間:2019年4月20日 下午11:47:20      
12 * 修改時間:2019年4月20日 下午11:47:20   
13 * 修改備註:   
14 *
15  */
16 public class UseDemo {
17     static DefaultParameterValidateService dpvs = new DefaultParameterValidateService();
18     static {
19         try {
20             dpvs.init(ParameterValidatorDemo.class);
21         } catch (Exception e) {
22             System.out.println("initialization failure");
23             e.printStackTrace();
24         }
25     }
26 
27     public static void main(String[] args) {
28         String legalphone = "15073207380";
29         String illegalphone = "1507320738";
30         
31         String legalpassword="12345678ABC";
32         String illegalpassword="12345";
33         
34         User user = new User();
35         user.setPhoneNumber(legalphone);
36         user.setPassword(legalpassword);
37         try {
38             System.out.println(user.toString() + "validate result: "
39                     + dpvs.validate(user));
40             user.setPhoneNumber(illegalphone);
41             System.out.println(user.toString() + "validate result: "
42                     + dpvs.validate(user));
43             user.setPassword(illegalpassword);
44             System.out.println(user.toString() + "validate result: "
45                     + dpvs.validate(user));
46             dpvs.setAllResult(true);
47             System.out.println(user.toString() + "validate result: "
48                     + dpvs.validate(user));
49         } catch (Exception e) {
50             e.printStackTrace();
51         }
52 //        System.out.println(new ParameterValidatorDemo().phoneNumber("15073207380"));
53     }
54     /**
55      * 
56      * 
57      * 項目名稱:ParameterValidator 類名稱: User 類描述: your entity 建立人: HumorChen
58      * 建立時間:2019年4月20日 下午10:31:51 修改時間:2019年4月20日 下午10:31:51 修改備註:
59      * 
60      */
61 
62 }
63 
64 class User {
65     private String phoneNumber;
66     private String password;
67 
68     public String getPhoneNumber() {
69         return phoneNumber;
70     }
71 
72     public void setPhoneNumber(String phoneNumber) {
73         this.phoneNumber = phoneNumber;
74     }
75 
76     public String getPassword() {
77         return password;
78     }
79 
80     public void setPassword(String password) {
81         this.password = password;
82     }
83     public String toString()
84     {
85         return "phoneNumber:"+phoneNumber+"\npassword:"+password+"\n";
86     }
87 }
View Code

示範調用類運行結果:

DefaultParameterValidateService initialize success
phoneNumber:15073207380
password:12345678ABC
validate result: SUCCESS
phoneNumber:1507320738
password:12345678ABC
validate result: illegal phone number
phoneNumber:1507320738
password:12345
validate result: illegal phone number
phoneNumber:1507320738
password:12345
validate result: illegal phone number
illegal password

附:

該套HTTP請求參數驗證器服務ParamertValidateService,只須要寫一個參數驗證器的類,該類中爲每一個須要驗證的參數寫個同名方法(參數爲Object object),在方法內寫本身的驗證邏輯,驗證經過則返回ParameterValidateService.SUCCESS,不然返回自定義錯誤提示,可選擇單錯誤提示模式和全錯誤提示模式,單錯誤提示模式下當驗證器發現參數不合法時會立馬將該錯誤返回,而全錯誤模式下會驗證完全部參數後,將全部錯誤緣由返回(以DefaultParameterValidateService.ReasonSeparator分隔,可自定義)。調用該服務時只須要這樣寫DefaultParameterValidateService.validate(POJO pojo);便可對pojo內全部屬性進行驗證,並將結果返回。全部參數驗證所有經過則返回ParameterValidateService.SUCCESS,不然返回錯誤提示。

相關文章
相關標籤/搜索