首页 > 代码库 > javaee6的核心特性--bean验证框架(整理)

javaee6的核心特性--bean验证框架(整理)


概述

在Java EE 6的Bean Validation出现之前,开发者不得不在表示层框架、业务层/持久层中编写验证规则以保证这些规则的同步性,但这么做非常浪费时间而且极易出错。Bean Validation是通过约束实现的,这些约束以注解的形式出现,注解可以放在JavaBean(如backing bean)的属性、方法或是类上面。约束既可以是内建的注解(位于javax.validation.constraints包下面),也可以由用户定义。

bean validate标准规范文档请查阅:https://jcp.org/aboutJava/communityprocess/final/jsr303/index.html


JSR303 内置的约束规则

@AssertTrue / @AssertFalse 
验证适用字段:boolean
注解说明:验证值是否为true / false
属性说明:-

@DecimalMax / @DecimalMin 
验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long
注解说明:验证值是否小于或者等于指定的小数值,要注意小数存在精度问题
属性说明:公共

@Digits 
验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long
注解说明:验证值的数字构成是否合法
属性说明:integer:指定整数部分的数字的位数。fraction: 指定小数部分的数字的位数。

@Future / @Past 
验证适用字段:Date,Calendar
注解说明:验证值是否在当前时间之后 / 之前
属性说明:公共

@Max / @Min 
验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long
注解说明:验证值是否小于或者等于指定的整数值
属性说明:公共

@NotNull / @Null 
验证适用字段:引用数据类型
注解说明:验证值是否为非空 / 空
属性说明:公共

@Pattern 
验证适用字段:String
注解说明:验证值是否配备正则表达式
属性说明:regexp:正则表达式flags: 指定Pattern.Flag 的数组,表示正则表达式的相关选项。

@Size 
验证适用字段:String,Collection,Map,数组
注解说明:验证值是否满足长度要求
属性说明:max:指定最大长度,min:指定最小长度。

@Valid 
验证适用字段:引用类型
注解说明:验证值是否需要递归验证
属性说明:无


实例:

@Entity
@Table(name = "agent")
@SequenceGenerator(name = "seq_gen", sequenceName = "seq_agent")
public class AgentEntity extends IdEntity {

    @NotBlank(message = "名称不能为空")
    @Size(max = 128, message = "名称长度超过128")
    @Pattern(regexp = "^[\\u4e00-\\u9fa5\\w\\d_]*$", message = "名称不符合规范")
    private String name;

    @NotBlank(message = "代号不能为空")
    @Size(max = 16, message = "代号长度超过16")
    @Pattern(regexp = "^[0-9a-zA-Z_]*$", message = "代号不符合规范")
    private String code;

    private AgentStatusEnum status;

    private String description;

    private Long createTime;

    private String createUser;

    private Long updateTime;

    private String updateUser;

    private Long lastHeartBeat;

    public AgentEntity() {
        super();
        this.status = AgentStatusEnum.OFFLINE;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "code")
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Enumerated(EnumType.STRING)
    public AgentStatusEnum getStatus() {
        return status;
    }

    public void setStatus(AgentStatusEnum status) {
        this.status = status;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Column(name = "create_time")
    public Long getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Long createTime) {
        this.createTime = createTime;
    }

    @Column(name = "create_user")
    public String getCreateUser() {
        return createUser;
    }

    public void setCreateUser(String createUser) {
        this.createUser = createUser;
    }

    @Column(name = "update_time")
    public Long getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Long updateTime) {
        this.updateTime = updateTime;
    }

    @Column(name = "update_user")
    public String getUpdateUser() {
        return updateUser;
    }

    public void setUpdateUser(String updateUser) {
        this.updateUser = updateUser;
    }

    @Column(name = "last_heart_beat")
    public Long getLastHeartBeat() {
        return lastHeartBeat;
    }

    public void setLastHeartBeat(Long lastHeartBeat) {
        this.lastHeartBeat = lastHeartBeat;
    }
}


-------------------------------------------------------------------------------------------------------------------

补充:validate api

以下内容摘录自:http://developer.51cto.com/art/201003/190130.htm


Validation API


开发者可以借助于Validation API以编程的方式验证JavaBean。Bean Validation API的默认包是javax.validation。下面对该包中的一些类进行说明:

ConstraintValidator:这是一个接口,具体的约束验证类需要实现该接口。该接口定义了相关的逻辑以验证给定对象类型中的约束。


Validator:Validahttp://java.sun.com/javaee/6/docs/api/index.html?javax/validation/Validator.htmltor接口持有对象验证图的契约。该接口的实现必须是线程安全的。


ConstraintViolation:ConstraintViolation接口表示给定bean上的约束验证失败,它公开了约束违背上下文以及描述该违背情况的信息。


ValidationException:如果在验证过程中出现了某些不可恢复的错误就会抛出ValidationException异常。某些情况下可以指定该异常,如不合法的分组(group)定义、不合法的约束定义以及不合法的约束声明等等。


约束元数据请求API


Bean Validation规范提供了查询约束仓库的手段。该API主要用于工具支持和与其他框架、库以及JSR的集成。Bean Validation规范旨在为对象约束提供一个验证引擎和元数据仓库。需要进行约束定义、验证和元数据的框架(Java EE或Java SE)可以利用Bean Validation规范完成这些功能,从应用或是基础设施的角度来看,这么做可以避免不必要的重复工作。


Bean Validation已经集成到了JSF 2.0和JPA 2.0中。在JSF中可以将表单输入域与域对象的属性绑定起来。JSF 2和Bean Validation可以判断出绑定的是哪个属性并执行与之相关的验证,还会将约束违背的信息显示给用户。Hibernate Validator 4是Bean Validation规范的参考实现框架,其最新版增加了不少新特性,如分组验证、与JPA 2和JSF 2的自然集成以及扩展的注解集等等。

javaee6的核心特性--bean验证框架(整理)