红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

Java EE 6 Bean Validation 提供了实体验证元数据模型与 API

  • 2010-03-20
  • 本文字数:2114 字

    阅读完需:约 7 分钟

在此前发布的 Java Enterprise Edition( JEE )6系列文章中,我们介绍了Java API for RESTful Web Services( JAX-RS )、Contexts and Dependency Injection( CDI )、 Web 端(Servlet 3、JSF 2)以及 EJB 3.1。在本系列文章行将结束之际,我们再来谈谈 Bean Validation( JSR 303 )——Java EE 6 的一个核心特性,它为实体验证定义了一个元数据模型和 API。其默认的元数据源是注解,但开发者可以通过 XML 描述符对其进行扩展。Validation API 并不依赖特定的应用层或是编程模型,这样同一套验证可由应用的所有层共享。它还提供了通过扩展 Validation API 来增加客户化验证约束的机制以及查询约束元数据仓库的手段。

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

  • Min:被 @Min 所注解的元素必须是个数字,其值要大于或等于给定的最小值。
  • Max:被 @Max 所注解的元素必须是个数字,其值要小于或等于给定的最大值。
  • Size @Size 表示被注解的元素必须位于给定的最小值和最大值之间。支持 Size 验证的数据类型有 String、Collection(计算集合的大小)、Map 以及数组。
  • NotNull @NotNull 确保被注解的元素不能为 null。
  • Null @Null 确保被注解的元素一定为 null。
  • Pattern @Pattern 确保被注解的元素(String)一定会匹配给定的 Java 正则表达式。

下面的示例来自于 Java EE 6系列文章,代码中通过 Bean Validation 注解声明了一些约束:

复制代码
public class Address {
@NotNull @Size(max=30)
private String addressline1;
@Size(max=30)
private String addressline2;
public String getAddressline1() {
return addressline1;
}
public void setAddressline1(String addressline1) {
this.addressline1 = addressline1;
}
}

@NotNull 指定被注解的元素 addressline1 不能为 null;@Size 指定被注解的元素 addressline1 和 addressline2 不能超过给定的最大值,即 30 个字符。

在验证 Address 对象时,addressline1 的值被传递到针对 @NotNull 约束的验证类以及针对 @Size 约束的验证类中,而 addressline2 的值被传递到针对 @Size 约束的验证类中,由相关的验证类进行验证。

如下代码自定义了一个名为 ZipCode 的约束:

复制代码
@Size(min=5, max=5)
@ConstraintValidator(ZipcodeValidator.class)
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface ZipCode {
String message() default "Wrong zipcode";
String[] groups() default {};
}

可以将 @ZipCode 用在类、属性或是方法上,就像其他约束一样。

复制代码
public class Address {
@ZipCode
private String zipCode;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}

Validation API

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

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

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

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 的自然集成以及扩展的注解集等等。

查看英文原文: Java EE 6 Bean Validation Provides Entity Validation Metadata Model and API

2010-03-20 04:298098
用户头像

发布了 88 篇内容, 共 258.0 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

external-provisioner源码分析(1)-主体处理逻辑分析

良凯尔

Kubernetes 源码分析 Ceph CSI

第十一周总结

重读《重构2》- 封装变量

顿晓

重构 4月日更

Python-Net编程

若尘

Python 网络编程 net

新同学与老司机

小天同学

职场成长 工作体会 经验总结 4月日更 新同学

python 函数详解

若尘

函数编程 函数

四种软件架构概述

xcbeyond

Serverless 微服务 分布式架构 单体架构 4月日更

架构实战营模块二总结

竹林七贤

安卓内存监控悬浮窗,2021Android面试心得,全套教学资料

欢喜学安卓

android 程序员 面试 移动开发

k8s通过ceph-csi接入存储的概要分析

良凯尔

Kubernetes 源码分析 Ceph CSI

LitmusChaos: K8s上的混沌工程框架

混沌工程实践

k8s 混沌工程 litmuschaos 实践框架 故障实验库

基于crudapi增删改查接口后端Java SDK二次开发之环境搭建(一)

crudapi

Java API sdk crud crudapi

数据脱敏:数仓安全隐私保护见真招儿

华为云开发者联盟

数据仓库 加密 隐私保护 GaussDB(DWS) 数据脱敏

计算机原理学习笔记 Day7

穿过生命散发芬芳

计算机原理 4月日更

华仔训练营第二次作业

方堃

Go Functions

escray

学习 极客时间 Go 语言 4月日更

因为这几个TypeScript代码的坏习惯,同事被罚了500块

华为云开发者联盟

typescript 运算符 代码 null strict

Flutter 学习笔记(一) Text 组件

U2647

flutter 4月日更

Golang Map 和字符串

escray

学习 极客时间 Go 语言 4月日更

安卓rxjava合并多个请求,我的阿里手淘面试经历分享,面试必会

欢喜学安卓

android 程序员 面试 移动开发

external-provisioner源码分析(2)-main方法与Leader选举分析

良凯尔

Kubernetes 源码分析 Ceph CSI

架構實戰營 - 模塊 2 作業

Frank Yang

架构实战营

Play with Go

Rayjun

教程 Go 语言

external-provisioner源码分析(3)-组件启动参数分析

良凯尔

Kubernetes 源码分析 Ceph CSI

自学软件测试怎么学?(送思维导图+学习资源)

程序员阿沐

学习 软件测试 性能测试 自动化测试 测试开发

面向对象编程九诫

风翱

面向对象编程 4月日更

热乎的6个Notion使用技巧,学不会算我输。

彭宏豪95

效率 Notion 笔记 4月日更

模块二作业

求索

架构实战营

【架构实战营】第二模块作业

烟雨濛濛

架构实战营

架构实战营模块二作业

日照时间长

架构实战营

kubernetes ceph-csi分析-目录导航

良凯尔

Kubernetes 源码分析 Ceph CSI Kubernetes Plugin

Java EE 6 Bean Validation提供了实体验证元数据模型与API_Java_Srini Penchikala_InfoQ精选文章