摘要:故在介紹一款非常好用的后端驗證數據有效性的框架已經內置支持字段非空,數據長度,數據范圍,正則匹配等驗證,同時還可以在此框架的基礎上實現自定義的驗證。
介紹
如今開發項目中數據的安全驗證已經是必不可少的一部分,如果只是讓前段做驗證,并不能保證整個系統的安全。故在介紹一款非常好用的后端驗證數據有效性的框架:oval
oval已經內置支持字段非空,數據長度,數據范圍,正則匹配等驗證,同時還可以在此框架的基礎上實現自定義的驗證。這次我就介紹一下常用的數據是否在數據庫重復的驗證。
依賴:
net.sf.oval oval 1.90
簡單使用
在此我定義一個User的實體類,其簡單的驗證代碼如下:
public class User { @NotNull(message = "username can not be null",profiles = "username") @Length(min = 8,max = 20,message = "username length error.",profiles = "username") @MatchPattern(pattern = "(w+)",message = "username have special characters.",profiles = "username") private String username; private String password; }
profiles 表示給該字段定義一個標簽,為對象字段的選擇性驗證而存在。
自定義驗證注解
上面的列子只是oval自帶的一些驗證,當然這里也沒有列舉完全,如果有興趣可以去查詢其api.基本可以滿足大部分項目需求。但如果需要定義一些特殊的驗證規則這需要我們自己實現一部分代碼。我這里舉一個數據庫的字段名是否重復的驗證代碼示例。
注解類:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Constraint(checkWith = UniqueCheck.class) public @interface Unique { ConstraintTarget[] appliesTo() default {ConstraintTarget.VALUES}; String errorCode() default "unique error"; String message() default "field duplicate"; String[] profiles() default {}; int severity() default 0; String target() default ""; String when() default ""; String field(); String tablename(); @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Constraints public @interface List { net.sf.oval.constraint.Length[] value(); String when() default ""; } }
數據庫驗重:
public class UniqueCheck extends AbstractAnnotationCheck{ private String field; private String tablename; private String message; public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context, Validator validator) throws OValException { if (validatedObject == null) return true; String value = valueToValidate.toString(); /** * 在此處將表名,字段,值做數據庫操作 * * if exist ,return false */ return true; } @Override protected Map createMessageVariables() { Map re = Validator.getCollectionFactory().createMap(2); re.put("message", this.message); return re; } @Override public void configure(Unique unique) { super.configure(unique); field = unique.field(); tablename = unique.tablename(); message = unique.message(); } }
至此,你只需要在username上面加上如下注解即可支持字段唯一性驗證:
@Unique(field="username",tablename="tb_user",profiles="username",message="數據庫已存在")
執行代碼
public static void main(String[] args) { User user = new User("zhangsna"); MyValidator.validator(person, "username"); } static class MyValidator { public staticvoid validator(T t, String... profiles) { Validator v = new Validator(); List message = v.validate(t, profiles); for (ConstraintViolation var : message) { System.out.println(var.getMessage()); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68552.html
摘要:先看效果原諒我的渣像素,進度的刻度寬度顏色可以隨意設定項目地址實現起來并不難,通過本文,我們可以學到自定義屬性的使用。 showImg(/img/remote/1460000006806723); 先看效果(原諒我的渣像素),進度的刻度、寬度、顏色可以隨意設定: showImg(/img/remote/1460000006806724); showImg(/img/remote/146...
摘要:的自身注解的用法。所以自定義注解的作用很廣。但是在這里,我僅僅基于的來實現適用于它的自定義注解。其他的自定義的注解的編寫思路和這個也是類似的。 基于shiro的自定義注解的擴展 根據我的上一篇文章,權限設計的雜談中,涉及到了有關于前后端分離中,頁面和api接口斷開表與表層面的關聯,另辟蹊徑從其他角度找到方式進行關聯。這里我們主要采取了shiro的自定義注解的方案。本篇文章主要解決以下的...
摘要:閱讀原文造個輪子我學到了什么聽說的最多的是不是不要重復的造輪子不要被這句話蒙騙了,這句話應該還沒說完整,在什么情況下不要造輪子實際項目中由于工期和質量原因,肯定不希望你造輪子,你造輪子花費時間且質量不如現有的輪子。 閱讀原文:造個輪子,我學到了什么 聽說的最多的是不是不要重復的造輪子?不要被這句話蒙騙了,這句話應該還沒說完整,在什么情況下不要造輪子?實際項目中由于工期和質量原因,肯定不...
摘要:例子參考自官方文檔,官方文檔的配置有點過期了,一兩個屬性不合法。類,測試類,配置,輸出結果, 例子參考自官方文檔,http://oval.sourceforge.net/u...官方文檔的xml配置有點過期了,一兩個屬性不合法。 ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─honey │ │ │ ...
閱讀 3558·2021-11-08 13:15
閱讀 2115·2019-08-30 14:20
閱讀 1398·2019-08-28 18:08
閱讀 990·2019-08-28 17:51
閱讀 1499·2019-08-26 18:26
閱讀 3000·2019-08-26 13:56
閱讀 1499·2019-08-26 11:46
閱讀 2595·2019-08-23 14:22