文档章节

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

为为02
 为为02
发布于 2016/10/13 15:30
字数 1317
阅读 336
收藏 1

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

© 著作权归作者所有

为为02
粉丝 51
博文 44
码字总数 99356
作品 0
海淀
程序员
私信 提问
Spring Validation实现原理分析

最近要做动态数据的提交处理,即需要分析提交数据字段定义信息后才能明确对应的具体字段类型,进而做数据类型转换和字段有效性校验,然后做业务处理后提交数据库,自己开发一套校验逻辑的话周...

68号小喇叭
2018/07/08
0
0
JSR 303 - Bean Validation 介绍及最佳实践

JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案。2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个重要特性被包含其中。本文将对 Bean Validation 的...

IBMdW
2011/05/25
4K
1
使用Spring Validation 完成后端数据校验

转载并修改于:使用spring validation完成数据后端校验 前言 Web开发中JS校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器...

Jitwxs
2018/10/11
0
0
Hibernate Validator

本文主要讲述如何使用hibernate validator来校验入参,避免在业务代码里进行每个接口进行入参校验,提搞代码的简洁及欣赏性。 主要涉及针对接口方法的入参简单校验,不涉及使用group进行的组...

A-I-O
2018/11/07
444
0
JSR303 - Bean Validation 介绍及最佳实践

关于 Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的...

heroShane
2014/02/26
173
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
30分钟前
4
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
30分钟前
3
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
32分钟前
4
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
35分钟前
4
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
35分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部