Java對象校驗框架之Oval


 

只要有接口,就會有參數的校驗,目前開源的校驗框架已經非常多了,不過不得不提一下Oval。
OVal 是一個可擴展的Java對象數據驗證框架,驗證的規則可以通過配置文件、Annotation、POJOs 進行設定。可以使用純 Java 語言、JavaScript 、Groovy 、BeanShell 等進行規則的編寫。
使用起來也非常簡單

public class OvalTest {
    @Min(20)
    private int age;
    @Length(min = 6, max = 10)
    private String name;
    
    public static void main(String[] args) {
        OvalTest ovalTest = new OvalTest();
        ovalTest.age = 10;
        ovalTest.name = "kolor";
        
        Validator validator = new Validator(); 
        
        List<ConstraintViolation> ret = validator.validate(ovalTest);
        System.out.println(ret);
    }
}
<p><?xml version="1.0" encoding="UTF-8"?>
<!-- 
<!DOCTYPE oval PUBLIC 
&nbsp;&nbsp; "-//OVal/OVal Configuration DTD 1.3//EN"
&nbsp;&nbsp; "<a href="http://oval.sourceforge.net/oval-configuration-1.3.dtd">http://oval.sourceforge.net/oval-configuration-1.3.dtd</a>">
-->
<oval xmlns="<a href="http://oval.sf.net/oval-configuration">http://oval.sf.net/oval-configuration</a>" xmlns:xsi="<a href="http://http://www.w3.org/2001/XMLSchema-instance">http://http://www.w3.org/2001/XMLSchema-instance</a>"
&nbsp;xsi:schemaLocation="<a href="http://oval.sf.net/oval-configuration">http://oval.sf.net/oval-configuration</a> ../../../../../../../../main/resources/net/sf/oval/configuration/xml/oval-configuration.xsd"
>
&nbsp;<!-- define a constraint set -->
&nbsp;<!--<constraintSet id="user.userid">
&nbsp;&nbsp;<notNull message="{context} is null" />
&nbsp;&nbsp;<matchPattern message="{context} does not match the pattern {pattern}">
&nbsp;&nbsp;&nbsp;<pattern pattern="<a href="file://\\d{15}|\\d{17}+[\\dX">\\d{15}|\\d{17}+[\\dX</a>]" flags="0" />
&nbsp;&nbsp;</matchPattern>
&nbsp;</constraintSet>--></p><p>&nbsp;<class type="com.haove.oval.TrainData" overwrite="false" applyFieldConstraintsToSetters="false">
&nbsp;&nbsp;
&nbsp;&nbsp;<field name="sfzh">
&nbsp;&nbsp;&nbsp;<matchPattern message="身份證號不符合規則">
&nbsp;&nbsp;&nbsp;<pattern pattern="[0-9]{15}|[0-9]{17}[0-9X]" flags="0" />
&nbsp;&nbsp;&nbsp;</matchPattern>
&nbsp;&nbsp;</field>
&nbsp;&nbsp;
&nbsp;&nbsp;<field name="xm">
&nbsp;&nbsp;&nbsp;<length min="1" max="24" message="姓名為 {min} 至 {max}個字符" />
&nbsp;&nbsp;&nbsp;<validateWithMethod methodName="isValid" parameterType="java.lang.String" message="姓名與學籍庫不一致"/>
&nbsp;&nbsp;</field>
&nbsp;&nbsp;
&nbsp;&nbsp;<field name="qjStart">
&nbsp;&nbsp;&nbsp;<length min="1" message="區間起點不能少於{min}個字符" />
&nbsp;&nbsp;</field> 
&nbsp;&nbsp;
&nbsp;&nbsp;<field name="qjEnd" overwrite="true">
&nbsp;&nbsp;&nbsp;<length min="1" message="區間終點不能少於{min}個字符" />
&nbsp;&nbsp;</field></p><p>&nbsp;&nbsp;<field name="rxrq">
&nbsp;&nbsp;&nbsp;<matchPattern message="入學日期為8位數字">
&nbsp;&nbsp;&nbsp;<pattern pattern="[0-9]{8}"/>
&nbsp;&nbsp;&nbsp;</matchPattern>
&nbsp;&nbsp;</field>
&nbsp;&nbsp;<field name="yhcs">
&nbsp;&nbsp;&nbsp;<matchPattern message="優惠次數為一位或兩位數字">
&nbsp;&nbsp;&nbsp;<pattern pattern="[0-9]{1,2}" flags="0" />
&nbsp;&nbsp;&nbsp;</matchPattern>
&nbsp;&nbsp;</field>
&nbsp;&nbsp;
&nbsp;&nbsp;<field name="kxlh">
&nbsp;&nbsp;&nbsp;<length min="1" message="卡序列號不能少於{min}個字符" />
&nbsp;&nbsp;</field>
&nbsp;</class>
</oval></p>

這個xml里包含了<notNull />,<notBlank />,<validateWithMethod />,<dateRange />,<pattern />等幾種校驗,比較有特點的是可以自定義方法校驗validateWithMethod,有了這個就可以將校驗擴展的更加強大,比如說可以將數據跟數據庫里的數據進行比較校驗。還有其他校驗,可以參考源碼,或問我。

另外,經查源碼,發現方法public List<ConstraintViolation> validateFieldValue(final Object validatedObject, final Field validatedField,   final Object fieldValueToValidate)可以只校驗自己想校驗的field,不會校驗全部field,這個在有些時候還是蠻有用的。

另外附上,使用xml校驗的java源碼例子:

 

import java.lang.reflect.Field;
import java.util.List;

import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import net.sf.oval.configuration.xml.XMLConfigurer;

public class TrainData {
    private String xm;
    private String sfzh;
    private String qjStart;
    private String qjEnd;
    private String rxrq;
//    @ValidateWithMethod(methodName = "isValid", parameterType = String.class)
    private String yhcs;
    private String kxlh;
    public TrainData(){}
    public TrainData(String xm, String sfzh, String qjStart, String qjEnd, String rxrq, String yhcs, String kxlh){
        this.xm = xm;
        this.sfzh = sfzh;
        this.qjStart = qjStart;
        this.qjEnd = qjEnd;
        this.rxrq = rxrq;
        this.yhcs = yhcs;
        this.kxlh = kxlh;
    }
    private boolean isValid(String xm) {
        //to do 數據庫根據身份證號查詢出的姓名進行比較
        if("1".equals(xm))
            return true;
        return false;
    }
    public static void main(String[] args) {
        try{
        TrainData data = new TrainData("劉艷梅","11010619770201304","","","20050101","2","123");
        XMLConfigurer x2 = new XMLConfigurer();
        x2.fromXML(XMLConfigurationTest.class.getResourceAsStream("TrainDataValidation.xml"));
        Validator validator = new Validator(x2);
//        Validator validator = new Validator();
//        Field f=TrainData.class.getDeclaredField("xm");
//        List<ConstraintViolation> violations = validator.validateFieldValue(new TrainData(), f, "12");
        List<ConstraintViolation> violations = validator.validate(data);
        for(ConstraintViolation var:violations){
            System.out.println(var.getMessage());
        }
        }catch(Exception ex){
            
        }
    }
}

 

參考:http://blog.csdn.net/haove/article/details/6901366


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM