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();
}

验证复杂输入参数

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

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

@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;

    // ...
}

验证返回值(非响应)

要将验证应用到常规方法返回值(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 );
}

验证返回值(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();
}

65.2.2. 标准注解

Bean 验证限制

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

表 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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

© 2024 Red Hat, Inc.