国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

OVAL實(shí)現(xiàn)自定義基于注解的數(shù)據(jù)驗(yàn)證

2i18ns / 2775人閱讀

摘要:故在介紹一款非常好用的后端驗(yàn)證數(shù)據(jù)有效性的框架已經(jīng)內(nèi)置支持字段非空,數(shù)據(jù)長(zhǎng)度,數(shù)據(jù)范圍,正則匹配等驗(yàn)證,同時(shí)還可以在此框架的基礎(chǔ)上實(shí)現(xiàn)自定義的驗(yàn)證。

介紹

如今開(kāi)發(fā)項(xiàng)目中數(shù)據(jù)的安全驗(yàn)證已經(jīng)是必不可少的一部分,如果只是讓前段做驗(yàn)證,并不能保證整個(gè)系統(tǒng)的安全。故在介紹一款非常好用的后端驗(yàn)證數(shù)據(jù)有效性的框架:oval
oval已經(jīng)內(nèi)置支持字段非空,數(shù)據(jù)長(zhǎng)度,數(shù)據(jù)范圍,正則匹配等驗(yàn)證,同時(shí)還可以在此框架的基礎(chǔ)上實(shí)現(xiàn)自定義的驗(yàn)證。這次我就介紹一下常用的數(shù)據(jù)是否在數(shù)據(jù)庫(kù)重復(fù)的驗(yàn)證。
依賴:

        
            net.sf.oval
            oval
            1.90
        

簡(jiǎn)單使用

在此我定義一個(gè)User的實(shí)體類,其簡(jiǎn)單的驗(yàn)證代碼如下:

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 表示給該字段定義一個(gè)標(biāo)簽,為對(duì)象字段的選擇性驗(yàn)證而存在。

自定義驗(yàn)證注解

上面的列子只是oval自帶的一些驗(yàn)證,當(dāng)然這里也沒(méi)有列舉完全,如果有興趣可以去查詢其api.基本可以滿足大部分項(xiàng)目需求。但如果需要定義一些特殊的驗(yàn)證規(guī)則這需要我們自己實(shí)現(xiàn)一部分代碼。我這里舉一個(gè)數(shù)據(jù)庫(kù)的字段名是否重復(fù)的驗(yàn)證代碼示例。

注解類:

@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 "";
    }

}

數(shù)據(jù)庫(kù)驗(yàn)重:

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();
        /**
         * 在此處將表名,字段,值做數(shù)據(jù)庫(kù)操作
         *
         * 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上面加上如下注解即可支持字段唯一性驗(yàn)證:

 @Unique(field="username",tablename="tb_user",profiles="username",message="數(shù)據(jù)庫(kù)已存在")

執(zhí)行代碼

public static void main(String[] args) {
        User user = new User("zhangsna");
        MyValidator.validator(person, "username");
    }

    static class MyValidator {
        public static  void validator(T t, String... profiles) {
            Validator v = new Validator();
            List message = v.validate(t, profiles);
            for (ConstraintViolation var : message) {
                System.out.println(var.getMessage());
            }
        }
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68552.html

相關(guān)文章

  • 從一個(gè)簡(jiǎn)潔進(jìn)度刻度繪制中了解定義 View 思路流程

    摘要:先看效果原諒我的渣像素,進(jìn)度的刻度寬度顏色可以隨意設(shè)定項(xiàng)目地址實(shí)現(xiàn)起來(lái)并不難,通過(guò)本文,我們可以學(xué)到自定義屬性的使用。 showImg(/img/remote/1460000006806723); 先看效果(原諒我的渣像素),進(jìn)度的刻度、寬度、顏色可以隨意設(shè)定: showImg(/img/remote/1460000006806724); showImg(/img/remote/146...

    王巖威 評(píng)論0 收藏0
  • 基于shiro定義注解擴(kuò)展

    摘要:的自身注解的用法。所以自定義注解的作用很廣。但是在這里,我僅僅基于的來(lái)實(shí)現(xiàn)適用于它的自定義注解。其他的自定義的注解的編寫思路和這個(gè)也是類似的。 基于shiro的自定義注解的擴(kuò)展 根據(jù)我的上一篇文章,權(quán)限設(shè)計(jì)的雜談中,涉及到了有關(guān)于前后端分離中,頁(yè)面和api接口斷開(kāi)表與表層面的關(guān)聯(lián),另辟蹊徑從其他角度找到方式進(jìn)行關(guān)聯(lián)。這里我們主要采取了shiro的自定義注解的方案。本篇文章主要解決以下的...

    YuboonaZhang 評(píng)論0 收藏0
  • 造個(gè)輪子,我學(xué)到了什么

    摘要:閱讀原文造個(gè)輪子我學(xué)到了什么聽(tīng)說(shuō)的最多的是不是不要重復(fù)的造輪子不要被這句話蒙騙了,這句話應(yīng)該還沒(méi)說(shuō)完整,在什么情況下不要造輪子實(shí)際項(xiàng)目中由于工期和質(zhì)量原因,肯定不希望你造輪子,你造輪子花費(fèi)時(shí)間且質(zhì)量不如現(xiàn)有的輪子。 閱讀原文:造個(gè)輪子,我學(xué)到了什么 聽(tīng)說(shuō)的最多的是不是不要重復(fù)的造輪子?不要被這句話蒙騙了,這句話應(yīng)該還沒(méi)說(shuō)完整,在什么情況下不要造輪子?實(shí)際項(xiàng)目中由于工期和質(zhì)量原因,肯定不...

    Acceml 評(píng)論0 收藏0
  • 根據(jù)xml配置校驗(yàn)bean

    摘要:例子參考自官方文檔,官方文檔的配置有點(diǎn)過(guò)期了,一兩個(gè)屬性不合法。類,測(cè)試類,配置,輸出結(jié)果, 例子參考自官方文檔,http://oval.sourceforge.net/u...官方文檔的xml配置有點(diǎn)過(guò)期了,一兩個(gè)屬性不合法。 ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─honey │ │ │ ...

    lemanli 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

2i18ns

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<