Java自定義數據驗證註解Annotation

本文轉載自:https://www.jianshu.com/p/616924cd07e6php

Java註解Annotation用起來很方便,也愈來愈流行,因爲其簡單、簡練且易於使用等特色,不少開發工具都提供了註解功能,很差的地方就是代碼入侵比較嚴重,因此使用的時候要有必定的選擇性。java

這篇文章將利用註解,來作一個Bean的數據校驗。編程

下載

http://pan.baidu.com/s/1mgn2AHa

**項目結構 **

定義註解

該註解能夠驗證成員屬性是否爲空,長度,提供了幾種常見的正則匹配,也可使用自定義的正則去判斷屬性是否合法,同時能夠爲該成員提供描述信息。工具

定義註解

該註解能夠驗證成員屬性是否爲空,長度,提供了幾種常見的正則匹配,也可使用自定義的正則去判斷屬性是否合法,同時能夠爲該成員提供描述信息。開發工具

package org.xdemo.validation.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.xdemo.validation.RegexType; /** * 數據驗證 * @author Goofy */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.PARAMETER}) public @interface DV { //是否能夠爲空 boolean nullable() default false; //最大長度 int maxLength() default 0; //最小長度 int minLength() default 0; //提供幾種經常使用的正則驗證 RegexType regexType() default RegexType.NONE; //自定義正則驗證 String regexExpression() default ""; //參數或者字段描述,這樣可以顯示友好的異常信息 String description() default ""; } 

註解的解析

package org.xdemo.validation.annotation.support; import java.lang.reflect.Field; import org.xdemo.validation.RegexType; import org.xdemo.validation.annotation.DV; import org.xdemo.validation.utils.RegexUtils; import org.xdemo.validation.utils.StringUtils; /** * 註解解析 * @author Goofy */ public class ValidateService { private static DV dv; public ValidateService() { super(); } //解析的入口 public static void valid(Object object) throws Exception{ //獲取object的類型 Class<? extends Object> clazz=object.getClass(); //獲取該類型聲明的成員 Field[] fields=clazz.getDeclaredFields(); //遍歷屬性 for(Field field:fields){ //對於private私有化的成員變量,經過setAccessible來修改器訪問權限 field.setAccessible(true); validate(field,object); //從新設置會私有權限 field.setAccessible(false); } } public static void validate(Field field,Object object) throws Exception{ String description; Object value; //獲取對象的成員的註解信息 dv=field.getAnnotation(DV.class); value=field.get(object); if(dv==null)return; description=dv.description().equals("")?field.getName():dv.description(); /*************註解解析工做開始******************/ if(!dv.nullable()){ if(value==null||StringUtils.isBlank(value.toString())){ throw new Exception(description+"不能爲空"); } } if(value.toString().length()>dv.maxLength()&&dv.maxLength()!=0){ throw new Exception(description+"長度不能超過"+dv.maxLength()); } if(value.toString().length()<dv.minLength()&&dv.minLength()!=0){ throw new Exception(description+"長度不能小於"+dv.minLength()); } if(dv.regexType()!=RegexType.NONE){ switch (dv.regexType()) { case NONE: break; case SPECIALCHAR: if(RegexUtils.hasSpecialChar(value.toString())){ throw new Exception(description+"不能含有特殊字符"); } break; case CHINESE: if(RegexUtils.isChinese2(value.toString())){ throw new Exception(description+"不能含有中文字符"); } break; case EMAIL: if(!RegexUtils.isEmail(value.toString())){ throw new Exception(description+"地址格式不正確"); } break; case IP: if(!RegexUtils.isIp(value.toString())){ throw new Exception(description+"地址格式不正確"); } break; case NUMBER: if(!RegexUtils.isNumber(value.toString())){ throw new Exception(description+"不是數字"); } break; case PHONENUMBER: if(!RegexUtils.isPhoneNumber(value.toString())){ throw new Exception(description+"不是數字"); } break; default: break; } } if(!dv.regexExpression().equals("")){ if(value.toString().matches(dv.regexExpression())){ throw new Exception(description+"格式不正確"); } } /*************註解解析工做結束******************/ } } 

用到的幾個類

package org.xdemo.validation; /** * 經常使用的數據類型枚舉 * @author Goofy * */ public enum RegexType { NONE, SPECIALCHAR, CHINESE, EMAIL, IP, NUMBER, PHONENUMBER; } 

其中正則驗證類和字符串工具類請參考如下連接:測試

  1. SuperUtil之RegexUtils
  2. SuperUtil之StringUtils

使用方法

package org.xdemo.validation.test; import org.xdemo.validation.RegexType; import org.xdemo.validation.annotation.DV; public class User { @DV(description="用戶名",minLength=6,maxLength=32,nullable=false) private String userName; private String password; @DV(description="郵件地址",nullable=false,regexType=RegexType.EMAIL) private String email; public User(){} public User(String userName, String password, String email) { super(); this.userName = userName; this.password = password; this.email = email; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } 

測試代碼

import org.xdemo.validation.annotation.support.ValidateService;
 
/** * @author Goofy */ public class Test { public static void main(String[] args){ User user=new User("張三", "xdemo.org", "252878950@qq.com"); try { ValidateService.valid(user); } catch (Exception e) { e.printStackTrace(); } user=new User("zhangsan","xdemo.org","xxx@"); try { ValidateService.valid(user); } catch (Exception e) { e.printStackTrace(); } user=new User("zhangsan","xdemo.org",""); try { ValidateService.valid(user); } catch (Exception e) { e.printStackTrace(); } } } 

運行效果

做者:會編程的小螞蟻 連接:https://www.jianshu.com/p/616924cd07e6 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索