(励志架构师-4)

导读:本篇文章讲解 (励志架构师-4),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Oval框架

Java开源验证框架Oval是一个可扩展的Java对象数据验证框架,功能强大使用简单,验证规则可通过配置文件、注解等方式进行设置,规则的编写可以使用纯Java、JavaScript 、Groovy 、BeanShell等语言。

Oval官方地址: http://oval.sourceforge.net/,如果想了解具体Oval可以去官网看一些相关资料
工程实现Oval需要依赖相应的Jar包,本文采用maven工程在pom.xml文件中增加如下内容:

<dependency>
    <groupId>net.sf.oval</groupId>
    <artifactId>oval</artifactId>
    <version>1.81</version>
</dependency>

实现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<ConstraintViolation> 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<ConstraintViolation> message = validator.validate(user);//完全验证

2、选择性验证(多个验证中选择性验证)

List<ConstraintViolation> message = validator.validate(entity, profiles);

根据profiles进行选择性验证entity对象,可以指定多个profiles。

3、验证对象的某个字段

      public List<ConstraintViolation> 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")
	@ResponseBody
	public Map<String, Object> validate(
	        @Valid @RequestBody ValidatorPojo vp, Errors errors) {
	    Map<String, Object> errMap = new HashMap<>();
	    // 获取错误列表
	    List<ObjectError> 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 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16986.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!