根据xml配置校验bean

例子参考自官方文档,http://oval.sourceforge.net/u... 官方文档的xml配置有点过期了,一两个属性不合法。

├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─honey
│  │  │          ├─collection
│  │  │          └─oval
│  │  └─resources

Userbean类,

package com.honey.oval;

public class User {
    private String firstName;
    private String lastName;
    private String managerId;
    private String userId;

    public User() {

    }
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public void setPasswordExpirationDays(int days) {

    }

}

OvalAppTest测试类,

package com.honey;

import com.honey.oval.User;
import net.sf.oval.ConstraintViolation;
import net.sf.oval.configuration.xml.XMLConfigurer;
import net.sf.oval.guard.Guard;

import java.util.List;


public class OvalAppTest {

    public static void main(String[] args) {
        User user = new User("honey", "wang");
        XMLConfigurer xmlConfigurer = new XMLConfigurer(ClassLoader.class.getResourceAsStream("/oval-config.xml"));

        Guard guard = new Guard(xmlConfigurer);
        List<ConstraintViolation> constraintViolationList = guard.validate(user);
        System.out.println(constraintViolationList);
    }
}

xml配置,src/resources/oval-config.xml

<?xml version="1.0" ?>
<oval
        xmlns="http://oval.sf.net/oval-configuration"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd"
>
    <!-- define a constraint set -->
    <constraintSet id="user.userid">
        <notNull />
        <matchPattern matchAll="false">
            <pattern pattern="^[a-z0-9]{8}$" flags="0" />
        </matchPattern>
    </constraintSet>

    <!-- define checks for the acme.model.User class -->
    <!-- overwrite=false means already defined checks for this class will not be removed -->
    <class type="com.honey.oval.User" overwrite="false" applyFieldConstraintsToSetters="true">

        <field name="firstName">
            <length min="0" max="3" />
        </field>

        <field name="lastName">
            <length min="0" max="5" />
        </field>

        <!-- overwrite=true means previously defined checks for this field will be overwritten by the checks defined here -->
        <field name="managerId" overwrite="true">
            <!-- use the checks defined for the constaint set "user.userid" -->
            <assertConstraintSet id="user.userid" />
        </field>

        <field name="userId" overwrite="true">
            <!-- use the checks defined for the constaint set "user.userid" -->
            <assertConstraintSet id="user.userid" />
        </field>

        <!-- define constructor parameter checks -->
        <constructor>
            <!-- parameter1 -->
            <parameter type="java.lang.String">
                <notNull />
            </parameter>

            <!-- parameter 2 -->
            <!-- the types of all parameters must be listed, even if no checks are defined -->
            <parameter type="java.lang.String" />
        </constructor>

        <!-- define method parameter checks -->
        <method name="setPasswordExpirationDays">
            <!-- parameter 1 -->
            <parameter type="int">
                <notNull />
            </parameter>
        </method>
    </class>
</oval>

输出结果,

[net.sf.oval.ConstraintViolation: com.honey.oval.User.managerId cannot be null, net.sf.oval.ConstraintViolation: com.honey.oval.User.firstName is not between 0 and 3 characters long, net.sf.oval.ConstraintViolation: com.honey.oval.User.userId cannot be null]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coding

redis列表list类型详解

63520
来自专栏C/C++基础

2018腾讯内部调岗面试试题1——使用C/C++但不能用sizeof判断操作系统是32位还是64位

2018上半年折腾了一回,想换个后台开发岗尝试锻炼一下自己,面了三个部门,将有关有意思的题目汇总记录下来,供大家参考。

11910
来自专栏黑泽君的专栏

Java设计模式之单例设计模式

11120
来自专栏Android开发指南

7:多线程

30780
来自专栏北京马哥教育

Awk是什么?一文带运维小白快速掌握Linux Awk用法

作者:a8 Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和aw...

39060
来自专栏聊聊技术

原 初学ACM - 半数集(Half Se

39480
来自专栏linux驱动个人学习

contain_of宏定义

 Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得...

33640
来自专栏黑泽君的专栏

c语言中的堆、栈和内存映射

Static Area(静态区):存放全局变量/常量、静态变量/常量。 该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以改的。

17010
来自专栏木子昭的博客

简单点! python匿名函数!

适用场景 懒得为函数起名 函数只用一次 好处 写起来方便 避免对函数命名空间的污染 用法 按照字典特定键排序 ? 对字典年龄进行排序 格式 lambda 参数 ...

284100
来自专栏个人随笔

房上的猫:switch选择结构,与选择结构总结

switch选择结构: ? 一.定义:  switch选择结构,可以方便地解决等值判断问题 二.语法:  switch(表达式){   case 常量1:   ...

352110

扫码关注云+社区

领取腾讯云代金券