Java校验框架-Oval
介绍
文档:http://oval.sourceforge.net/userguide.html#dependencies
下载:https://sourceforge.net/projects/oval/
OVal is an extensible object validation framework for Java 5 or later. Annotations (@NotNull) or XML configuration files can be used to express class constraints. OVal can optionally use AspectJ to enforce automatic validation (DbC)
例子
代码
pom.xml
<dependencies>
<!-- OVAL验证框架 -->
<dependency>
<groupId>net.sf.oval</groupId>
<artifactId>oval</artifactId>
<version>1.87</version>
</dependency>
<!-- test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
Student.java
package com.ydfind.verify.oval.model;
import com.ydfind.verify.oval.TypeCheck;
import lombok.Data;
import net.sf.oval.constraint.*;
@Data
public class Student {
@NotNull(profiles = {"profile1"})
@Length(min = 2, profiles = {"profile1"})
private Integer id;
@Length(max = 1, profiles = {"profile1"})
private Integer age;
@CheckWith(value = TypeCheck.class, message = "名称必须为张三")
private String name;
private String address;
private String phone;
@NotEmpty
private String sex;
// @NotNull
@AssertValid// 递归校验,通常与notnull一起使用
private ClassInfo classInfo;
@Email(profiles = {"profile1"})
private String email;
@DateRange(format = "yyyy-MM-dd", message = "日期格式不正确")
private String birthDay;
}
ClassInfo.java
package com.ydfind.verify.oval.model;
import lombok.Data;
import net.sf.oval.constraint.NotEmpty;
@Data
public class ClassInfo {
@NotEmpty
private String school;
}
TypeCheck.java
package com.ydfind.verify.oval;
import net.sf.oval.constraint.CheckWithCheck;
public class TypeCheck implements CheckWithCheck.SimpleCheck{
@Override
public boolean isSatisfied(Object o, Object o1) {
if(o1 instanceof String && "张三".equals((String)o1)){
return true;
}
return false;
}
}
StudentVerifyTest.java
package com.ydfind.verify;
import com.ydfind.verify.oval.model.ClassInfo;
import com.ydfind.verify.oval.model.Student;
import lombok.extern.slf4j.Slf4j;
import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import org.junit.Test;
import java.util.List;
@Slf4j
public class StudentVerifyTest {
@Test
public void testVerify() {
Student student = new Student();
Validator validator = new Validator();
// 初始化为正确的校验参数
student.setId(10);
student.setAge(8);
student.setName("张三");
student.setAddress("北京市");
student.setPhone("18765230986");
student.setSex("男");
student.setEmail("yd@ydfind.com");
student.setBirthDay("1996-10-05");
ClassInfo classInfo = new ClassInfo();
classInfo.setSchool("北京外国语大学");
student.setClassInfo(classInfo);
verifyStudent(validator, student);
// 设置错误的参数
student.setId(1);
student.setAge(18);
student.setName("李四");
student.setSex("");
student.setEmail("www.ydfind.com");
student.getClassInfo().setSchool("");
student.setBirthDay("1996.10.05");
verifyStudent(validator, student);
// 设置错误的参数
student.setClassInfo(null);
validator.disableProfile("profile1");
verifyStudent(validator, student);
}
/**
* 对对象进行校验
* @param validator
* @param obj
*/
private static void verifyStudent(Validator validator, Object obj){
List<ConstraintViolation> violations = validator.validate(obj);
if(violations.size() > 0){
log.info("----------------------Object is invalid:------------------");
for(ConstraintViolation violation: violations){
log.error(violation.getMessage());
}
} else {
log.info("----------------------Object is valid:-------------------");
}
}
}
运行测试类
其他使用
@Size(min = 1, message = "查询类型不能为空")
private List<String> list;
@ValidateWithMethod(methodName = "isValidDate", parameterType = String.class
private String date;
public boolean isValidDate(String date) {
try {
DateUtils.parseDate(date, "yyyy-MM-dd");
} catch (ParseException e) {
return false;
}
return true;
}