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
类定义了其 id
和 name
字段的验证限制,如下所示:
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.2.3. 自定义注解
在 Hibernate 中定义自定义限制
可以使用 bean 验证 API 定义您自己的自定义约束注解。有关如何在 Hibernate 验证器实现中执行此操作的详情,请参考 Hibernate Validator 参考指南 中的 创建自定义限制 章节。