基于spring validation实现JAVA Bean Validation--数据验证功能(基于spring validation) (一) Validator包简介与validator接口

孤街浪徒 提交于 2019-12-09 15:33:17

Bean Validation-------JAVA BEAN 数据验证功能

 

数据验证在 Java 分层结构的应用开发中占据着重要位置。Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用。而今天,我们就去学习java中的数据验证功能之Bean Validation。

 

    首先我们来介绍一下Bean Validation。

   

Bean是java bean,是我们抽象出来的对象。如用户对象,这个对象肯定包含很多信息,如用户名,密码,权限等等信息。在实际的开发中,用户的登录验证,权限控制等是我们不得不关注的问题。举个例子,如用户登录功能,我们不但要在前台执行验证,在服务层后台同样也需要对用户信息进行验证。如果我们每进行一次业务操作,都需要去写一段验证的代码,这样无疑是非常累赘和易出错的。

Bean Validation 规范的目标就是避免多层验证的重复性。事实上,开发者更倾向于将验证规则直接放到 Java Bean 本身,使用注解的方式进行验证规则的设计。

JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能,并且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来。

接下来简单学习api和基本用法。由于spring

Spring 4.0 默认即支持Bean Validation 1.0 (JSR-303)和 Bean Validation 1.1(JSR-349)校验规范, 同时也能适配Spring的Validator校验接口。spring提供了数据绑定对象DataBinder,所谓的数据绑定就是自动把用户输入的数据自动绑定到我们用于处理用户数据逻辑的对象。在Spring中 Validator 和 Binder构成了Validation包.

首先查看一下spring的validator包下面的包结构

在这个包中第一个要用到的就是Validator接口,该接口提供数据验证的方法。接下来看一下Vlidator接口的源码:

package org.springframework.validation;
public interface Validator {
    /**是否为可以验证的类型*/
	boolean supports(Class<?> clazz);
    /**数据验证方法*/
	void validate(Object target, Errors errors);

}

 

方法:supports(Class) - 判断该Validator是否能校验提供的Class的实例?

方法:validate(Object, org.springframework.validation.Errors) - 校验给定的对象,如果有校验失败信息,将其放入Errors对象。

我们写一个简单的bean,演示一下Validitor接口的使用。

一个article对象,代码如下:

public class Article {
    private long id;
    private String name;
    private String content;
    private Date publishTime;
    private Date lastUpdateTime;
    private User author;
    private ArticleType articleType;
    // ... 省略其他属性
    // ... omit other attributes
    
    // ... omit getter and setter methods
}

然后为article类设置一个校验器,用来校验用户的artile是否满足规则

/**
 * @Author Wang Weiwei
 * @Since 16-10-13
 * @Describe
 * The validator of article
 */
public class ArticleValitors implements Validator {
    /**this validator is only fit to the article type*/
    public boolean supports(Class<?> clazz) {
        if (Article.class.equals(clazz)){
            return true;
        }
        return false;
    }


    public void validate(Object target, Errors errors) {
        Article article = (Article) target;
        ValidationUtils.rejectIfEmptyOrWhitespace(errors,"title","field.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors,"content","field.required");
        if (article.getTitle().length() > 100){
            errors.rejectValue("title","too.long.article");
        //...omit...
    }
}

ArticleValidator校验器只能校验类型为Article类型的数据对象,且在此对象中title不能为空,content属性也不能为空,title的长度也必须小于100,否则校验器会报错,并将错误信息存放到errors对象当中。通过这个校验器我们就能实现对article类型的简单的校验了。

前面我们谈到数据绑定和数据校验。如何拿到校验错误信息是我们最后需要讨论的一个问题。在上面的例子中,

我们拒绝了`title`和`content`属性。如果我们想要输出校验错误的提示信息,就要用到校验失败时设置的错误编码(本例中就是'title'和'content')。

当你调用`Errors`接口中的`rejectValue`方法或者它的任何一个方法,它的优先实现不仅仅会注册作为参数传入进来的错误编码,

还会注册一些遵循一定规则的错误编码。注册哪些规则的错误编码取决于你使用的`MessageCodesResolver`。当我们使用默认的`DefaultMessageCodesResolver`

时,除了会将错误信息注册到你指定的错误编码上之外,这些错误信息还会注册到包含属性名的错误编码上。假如你调用这样一个方法`rejectValue("title", "too.long.article")`,

Spring除了会注册`too.darn.old`这个错误编码外,还会注册`too.darn.old.age`和`too.darn.old.age.int`这两个错误编码(即一个是包含属性名,另外一个既包含属性名还包含

类型);这在Spring中作为一种约定,这样所有的开发者都能按照这种约定来定位错误信息了。

休息一会,等会去写spring中bean的装饰器BeanWrapper

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!