好處:方便了後端對HTTP請求中參數進行核驗,只需一次編寫效驗器,一行代碼便可對所有參數的pojo進行參數核驗!而且更改效驗邏輯時只需要更改效驗器類即可,實現瞭解耦合。 只需要程式員按照規範開發一個ParameterValidator類(如下圖1),將所有效驗方法寫在該類中即可在任意地方使用一行代碼 ...
好處:方便了後端對HTTP請求中參數進行核驗,只需一次編寫效驗器,一行代碼便可對所有參數的pojo進行參數核驗!而且更改效驗邏輯時只需要更改效驗器類即可,實現瞭解耦合。
只需要程式員按照規範開發一個ParameterValidator類(如下圖1),將所有效驗方法寫在該類中即可在任意地方使用一行代碼實現對所有參數的核驗(如下圖2)
圖1:(圖中寫了對手機號碼和密碼進行核驗的方法)
圖二:
Jar包:ParameterValidator.jar
url:http://xingxunxinxi.com/ParameterValidator.jar
項目結構:
com.xingxunxinxi.ParameterValidator包含該套參數驗證器服務的介面和預設實現類
HTTP請求參數驗證器服務介面:ParameterValidateService
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
預設實現類:DefaultParameterValidateService
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,否則返回錯誤提示。