• 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

  • 相关阅读:
    .NET开源系统
    DEDEcms二次开发数据表参数
    dede系统的pagebreak文章页面分页数量控制方法
    窗口最小化到托盘
    SEO项目各个阶段的工作分配
    scrollTop
    去除行内块间的间距
    jquery mobile
    nodejs学习
    cancelAnimationFrame无效
  • 原文地址:https://www.cnblogs.com/zhao123/p/3874417.html
Copyright © 2020-2023  润新知