(励志架构师-4)
Oval框架
Java开源验证框架Oval是一个可扩展的Java对象数据验证框架,功能强大使用简单,验证规则可通过配置文件、注解等方式进行设置,规则的编写可以使用纯Java、JavaScript 、Groovy 、BeanShell等语言。
Oval官方地址: http://oval.sourceforge.net/,如果想了解具体Oval可以去官网看一些相关资料
工程实现Oval需要依赖相应的Jar包,本文采用maven工程在pom.xml文件中增加如下内容:
net.sf.oval oval 1.81
实现Oval实体对象类,用户的年龄和名字进行校验,具体代码如下:
public class OvalTest { @Min(18) private int age; @Length(min = 6, max = 12) private String name; public static void main(String[] args) { OvalTest ovalTest = new OvalTest(); ovalTest.age = 12; ovalTest.name = "yoodb"; Validator validator = new Validator(); List ret = validator.validate(ovalTest); System.out.println(ret); }}
执行main函数后,输出结果如下:
[net.sf.oval.ConstraintViolation: OvalTest.age cannot be smaller than 18.0, net.sf.oval.ConstraintViolation: OvalTest.name is not between 6 and 12 characters long]
Oval支持很多类型注解,场景不同使用的注解也有不同,具体注解包含如下:
字符类型@AsserURL、@Email、@Length、@MaxLength、@MinLength@NotNull、@NotBlank、@NotEmpty、@Digits、@HasSubstring数值类型@Range、@Max、@Min、@NotNegative布尔类型@AssertFalse、@AssertTrue集合数组@Size、@MaxSize、@MinSize、@MemberOf、@NotMemberOf表达式或自定义@Assert、@CheckWith、@NotMatchPatternCheck,@MatchPatternCheck、@ValidateWithMethod
java 验证框架oval的使用方法
oval是通过注解进行定义,每个注解都有一些公共属性,其中message等其他属性,前面几篇已经说明,今天说明下profiles,表示可以给注解定义标识,在实际开始验证时,可以根据这个表示确定是否要验证,避免所有的注解必须要验证的尴尬。同时总结说明下oval的三种验证方式。 private String id; @Length(min=5,max=20,profiles="nc2") private String userName; private String userCode; @Length(min=5,max=20,profiles="nc") private String loginName;1、完全验证 Validator validator = new Validator(); SaUser user = (SaUser) entity; List message = validator.validate(user);//完全验证
2、选择性验证(多个验证中选择性验证)
List message = validator.validate(entity, profiles);根据profiles进行选择性验证entity对象,可以指定多个profiles。
3、验证对象的某个字段
public List validateFieldValue(final Object validatedObject, final Field validatedField,final Object fieldValueToValidate) 三种方法在实际都能用到,oval设计的真是堪称完美!
spring 注解验证@NotNull等使用方法
常用标签@Null 被注释的元素必须为null@NotNull 被注释的元素不能为null@AssertTrue 被注释的元素必须为true@AssertFalse 被注释的元素必须为false@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max,min) 被注释的元素的大小必须在指定的范围内。@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内@Past 被注释的元素必须是一个过去的日期@Future 被注释的元素必须是一个将来的日期@Pattern(value) 被注释的元素必须符合指定的正则表达式。@Email 被注释的元素必须是电子邮件地址@Length 被注释的字符串的大小必须在指定的范围内@NotEmpty 被注释的字符串必须非空@Range 被注释的元素必须在合适的范围内
example :
vo 页面传过来的数据进行校验inferface : 只是作为标记一个组别 可以在vo验证的某个字段上面加入多个组别,这样没有加入的组别就不会验证这个字段controller: 需要 加入 @Validated (GroupInterface1.class) //GroupInterface1.class是定义的分组 GroupInterface2.class 需要校验的字段是不会验证的
VO:
public class User implements Serializable { / * 主键 */ @NotNull(message = "primary is not null",groups = {GroupInterface1.class})private Long id;@Pattern(regexp = "[0123456789]",groups = {GroupInterface1.class,GroupInterface2.class},message = "hava a error Date")private Long maxDiscountAmount;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;@Future(message = "expireTime is not less than now",groups = {GroupInterface1.class,GroupInterface2.class})@NotNull(message = "expireTime is not null",groups = {GroupInterface1.class,GroupInterface2.class})private Date expireTime;}import java.util.Date;import javax.validation.constraints.DecimalMax;import javax.validation.constraints.DecimalMin;import javax.validation.constraints.Email;import javax.validation.constraints.Future;import javax.validation.constraints.Max;import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import org.hibernate.validator.constraints.Range;import org.springframework.format.annotation.DateTimeFormat;/ imports /public class ValidatorPojo {// 非空判断@NotNull(message = "id不能为空")private Long id;@Future(message = "需要一个将来日期") // 只能是将来的日期// @Past //只能去过去的日期@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化转换@NotNull // 不能为空
另一个例子:
Private Date date;@NotNull // 不能为空@DecimalMin(value = "0.1") // 最小值0.1元@DecimalMax(value = "10000.00") // 最大值10000元private Double doubleValue = null;@Min(value = 1, message = "最小值为1") // 最小值为1@Max(value = 88, message = "最大值为88") // 最大值88@NotNull // 不能为空private Integer integer;@Range(min = 1, max = 888, message = "范围为1至888") // 限定范围private Long range;// 邮箱验证@Email(message = "邮箱格式错误")private String email;@Size(min = 20, max = 30, message = "字符串长度要求20到30之间。")private String size;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Double getDoubleValue() {return doubleValue;}public void setDoubleValue(Double doubleValue) {this.doubleValue = doubleValue;}public Integer getInteger() {return integer;}public void setInteger(Integer integer) {this.integer = integer;}public Long getRange() {return range;}public void setRange(Long range) {this.range = range;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getSize() {return size;}public void setSize(String size) {this.size = size;}/ setter and getter /}
此时controller应该要加上@Valid ,否则不会验证!
/* * 解析验证参数错误 * @param vp —— 需要验证的POJO,使用注解@Valid 表示验证 * @param errors 错误信息,它由Spring MVC通过验证POJO后自动填充 * @return 错误信息Map */@RequestMapping(value = "/valid/validate")@ResponseBodypublic Map validate( @Valid @RequestBody ValidatorPojo vp, Errors errors) { Map errMap = new HashMap(); // 获取错误列表 List oes = errors.getAllErrors(); for (ObjectError oe : oes) { String key = null; String msg = null; // 字段错误 if (oe instanceof FieldError) { FieldError fe = (FieldError) oe; key = fe.getField();// 获取错误验证字段名 } else { // 非字段错误 key = oe.getObjectName();// 获取验证对象名称 } // 错误信息 msg = oe.getDefaultMessage(); errMap.put(key, msg); } return errMap;}
Spring Seruity 的demo 独立运行
链接:https://pan.baidu.com/s/1SpsTcbujfJy8HMM77JjG0A 提取码:lsh9 解压密码:java