65.2. 使用 Bean 验证开发服务


65.2.1. 注解服务 Bean

概述

使用 bean 验证开发服务的第一步是将相关的验证注解应用到代表您的服务的 Java 类或接口。验证注解可让您将约束应用到方法参数、返回值和类字段,然后在运行时检查它们,每次调用服务时。

验证简单的输入参数

要验证服务方法的参数(其中参数是简单的 Java 类型),您可以应用来自 bean 验证 API 的任何约束注解(javax.validation.constraints 软件包)。例如,以下代码示例测试 nullness (@NotNull 注释),id 字符串是否与 \\d+ 正则表达式匹配(@Pattern 注释),以及 名称 字符串的长度是范围 1 到 50 :

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
...
@POST
@Path("/books")
public Response addBook(
        @NotNull @Pattern(regexp = "\\d+") @FormParam("id") String id,
        @NotNull @Size(min = 1, max = 50) @FormParam("name") String name) {
    // do some work
    return Response.created().build();
}
Copy to Clipboard Toggle word wrap

验证复杂输入参数

要验证复杂的输入参数(对象实例),将 @Valid 注释应用到参数,如下例所示:

import javax.validation.Valid;
...
@POST
@Path("/books")
public Response addBook( @Valid Book book ) {
    // do some work
    return Response.created().build();
}
Copy to Clipboard Toggle word wrap

@Valid 注释没有指定任何约束。当您使用 @Valid 为 Book 参数标注时,您将有效地告知验证引擎在 Book 类的定义内查找验证约束。在本例中,Book 类定义了其 idname 字段的验证限制,如下所示:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
...
public class Book {
    @NotNull @Pattern(regexp = "\\d+") private String id;
    @NotNull @Size(min = 1, max = 50) private String name;

    // ...
}
Copy to Clipboard Toggle word wrap

验证返回值(非响应)

要将验证应用到常规方法返回值(non-Response),请在方法签名前添加注解。例如,要测试 nullness 的返回值(@NotNull 注释),并且以递归方式测试验证约束(@Valid 注释),请注释 getBook 方法,如下所示:

import javax.validation.constraints.NotNull;
import javax.validation.Valid;
...
@GET
@Path("/books/{bookId}")
@Override
@NotNull @Valid
public Book getBook(@PathParam("bookId") String id) {
    return new Book( id );
}
Copy to Clipboard Toggle word wrap

验证返回值(Response)

要将验证应用到返回 javax.ws.rs.core.Response 对象的方法,您可以使用与非响应案例相同的注解。例如:

import javax.validation.constraints.NotNull;
import javax.validation.Valid;
import javax.ws.rs.core.Response;
...
@GET
@Path("/books/{bookId}")
@Valid @NotNull
public Response getBookResponse(@PathParam("bookId") String id) {
    return Response.ok( new Book( id ) ).build();
}
Copy to Clipboard Toggle word wrap

65.2.2. 标准注解

Bean 验证限制

表 65.1 “Bean 验证的标准注解” 显示 Bean Validation 规范中定义的标准注解,可用于定义字段和方法返回值和参数的限制(任何标准注解都可在类级别上应用)。

Expand
表 65.1. Bean 验证的标准注解
注解适用于描述

@AssertFalse

布尔值,boolean

检查被注释的元素是否为 false

@AssertTrue

布尔值,boolean

检查注解的元素是否为 true

@DecimalMax(value=, inclusive=)

bigdecimal,BigInteger,CharSequence, byte ,byte,short,int, int,long 和 primitive 类型打包程序

inclusive=false 时,检查注解的值是否小于指定的最大值。否则,检查值是否小于或等于指定的最大值。value 参数指定 bigDecimal 字符串 格式 的最大值。

@DecimalMin(value=, inclusive=)

bigdecimal,BigInteger,CharSequence, byte ,byte,short,int, int,long 和 primitive 类型打包程序

inclusive=false 时,检查注解的值是否大于指定最小值。否则,检查值是否大于或等于指定最小值。value 参数指定 BigDecimal 字符串格式的最小值。

@digits (integer=, fraction=)

bigdecimal,BigInteger,CharSequence, byte ,byte,short,int, int,long 和 primitive 类型打包程序

检查注解的值是否为数字,最多为 整数 数字和 分数 分数。

@Future

java.util.Date, java.util.Calendar

检查注解的日期是否在以后。

@Max(value=)

bigdecimal,BigInteger,CharSequence, byte ,byte,short,int, int,long 和 primitive 类型打包程序

检查注解的值是否小于或等于指定的最大值。

@Min(value=)

bigdecimal,BigInteger,CharSequence, byte ,byte,short,int, int,long 和 primitive 类型打包程序

检查注解的值是否大于或等于指定最小值。

@NotNull

任何类型

检查注解的值是否不是 null

@Null

任何类型

检查注解的值是否为 null

@Past

java.util.Date, java.util.Calendar

检查注解的日期是过去的。

@Pattern(regex=, flag=)

CharSequence

检查注解的字符串是否与考虑给定标志 匹配的正则表达式 匹配。

@size (min=, max=)

CharSequence,Collection,Map 和 array

检查注解的集合、映射或数组的大小是否在 minmax (包含)之间。

@Valid

任何非原始类型

在注释的对象上递归执行验证。如果对象是集合或数组,则元素会递归验证。如果对象是一个映射,则值元素会递归验证。

65.2.3. 自定义注解

在 Hibernate 中定义自定义限制

可以使用 bean 验证 API 定义您自己的自定义约束注解。有关如何在 Hibernate 验证器实现中执行此操作的详情,请参考 Hibernate Validator 参考指南 中的 创建自定义限制 章节。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat