Java Bean 校验 API

简介: > 本文翻译自[Java Bean Validation Basics](https://www.baeldung.com/javax-validation) ## 概述 在这个文章里,我们简单介绍一如何使用标准校验框架来完成基本的Java Bean校验,该框架即JSR380,也被称为Bean Validation 2.0。 校验用户输入,在大多是应用程序中是超级常见的需求,Ja

本文翻译自Java Bean Validation Basics

概述

在这个文章里,我们简单介绍一如何使用标准校验框架来完成基本的Java Bean校验,该框架即JSR380,也被称为Bean Validation 2.0。

校验用户输入,在大多是应用程序中是超级常见的需求,Java Bean校验框架即是处理这部分逻辑的标准工具。

JSR308-Bean Validation 2.0

JSR 308是JavaBean校验API规范,它是JavaEE和JavaSE的一部分。该规范使用@NotNull,@Min和@Max这样的注解来确保一个Bean的属性符合特定的条件。

这个版本要求使用Java8或更高版本,利用Java8提供的新特性例如类型注解,并且支持新的类型例如Optional和LocalDate。

要获得更完整的信息,可以进一步阅读JSR 308的文档

依赖

  1. JSR 308规范的的标准API包含在validation-api中:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
  2. Hibernate Validator是validation-api的参考实现:

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.2.Final</version>
    </dependency>

另外,Hibernate Validator还提供了一个注解处理器,利用Java编译时注解处理机制,帮助开发人员发现校验注解使用的错误。仅需要添加如下依赖即可:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.0.2.Final</version>
    <scop>provided</scop>
</dependency>

hibernate-validator与hibernate的持久化框架支持是完全分离的,引入hibnernate-validator依赖并不会间接引入hibernate持久化相关的依赖。

  1. 表达式语言依赖

JSR 308规范支持违约信息的变量解析,并允许使用表达式。

为了解析表达式,我们必须添加表达式语言API和它的某个实现,GlassFish项目提供了表达式语言API的参考实现:

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>
 
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.6</version>
</dependency>

如果没有添加这些依赖到应用中,您会在运行时得到如下错误信息:

HV000183: Unable to load ‘javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead

使用校验注解

我们在这里使用UserBean作为例子,为它添加一些简单的校验。

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;

public class User {
 
    @NotNull(message = "Name cannot be null")
    private String name;
 
    @AssertTrue
    private boolean working;
 
    @Size(min = 10, max = 200, message 
      = "About Me must be between 10 and 200 characters")
    private String aboutMe;
 
    @Min(value = 18, message = "Age should not be less than 18")
    @Max(value = 150, message = "Age should not be greater than 150")
    private int age;
 
    @Email(message = "Email should be valid")
    private String email;
 
    // standard setters and getters 
}

该例子中使用的所有注解都是标准JSR注解:

  • @NotNull-校验被注解的属性不能为null
  • @AssertTrue-校验被注解的属性值必须为true
  • @Size-校验被注解的属性的尺寸必须在min和max之间,该注解可以在String,Collection,Map和数组属性上使用
  • @Min,@Max-校验备注解的属性值必须大于或小于指定的值
  • @Email-校验备注接的属性必须是有效的emal地址

JSR中还包含其他一些注解:

  • @NotEmpty-校验属性不能为null或空;可以在String,Collection,Map或数组类型属性上使用
  • @NotBlank-只能使用在文本类型的属性上,校验该属性不能为null或空白
  • @Positive,@PositiveOrZero-使用在数值属性上,校验该属性必须为正数或0
  • @Negative,@NegativeOrZero-使用在数值属性上,校验该属性必须为负数或0
  • @Past,@PastOrPresent-校验日期类型值必须是过去的时间或现在;支持Java8中新增加的日期类型,例如LocalDateTime
  • @Future,@FutureOrPresent-校验日期类型值必须在未来或现在

所有注解都可以设置messge属性,这个属性的值在校验失败时被用来渲染违约消息。

Validation-API提供的标准注解的message属性大都有默认值,使用者如无特别需求,无须设置该属性。

校验注解可以施加在集合的元素上

List<@NotBlank String> preferences;

在这个例子中,集合中的的所有元素都会被校验不能为null或空白

规范也支持Java8中新增的Optional类型:

private LocalDate dateOfBirth;
 
public Optional<@Past LocalDate> getDateOfBirth() {
    return Optional.of(dateOfBirth);
}

这个例子中,校验框架会自动将LocalDate值取出并校验。

编程校验

  1. 一些框架,例如Spring,仅仅使用注解即可出发校验过程。让我们不必直接编程使用校验API。但我们应当对其有所了解,以理解框架的运作原理。

下面让我们来手动编程配置一个校验环境:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

我们必须首先构建一个校验器(validator)对象,才能校验一个Bean。

  1. 定义一个待校验的Bean

    User user = new User();
    user.setWorking(true);
    user.setAboutMe("Its all about me!");
    user.setAge(50);
  2. 对上面定义的Bean进行校验

    Set<ConstraintViolation<User>> violations = validator.validate(user);

将user对象作为validate方法的参数传递给校验器对象,所有违背User对象定义的约束条件的信息包装为ConstraintViolation对象集合返回。

遍历违约信息,我们可以得到所有的违约消息

for (ConstraintViolation<User> violation : violations) {
    log.error(violation.getMessage()); 
}

在我们的例子中,违约对象集合中只会包含一个违约信息,“Name cannot be null”。

这个违约消息可以通过校验注解的message属性进行定义。

总结

本教程聚焦于标准Java校验API的基本内容,展示了使用基本javax.validation注解和API的使用方法。

所有的示例代码可以在GitHub上获取。

目录
相关文章
|
1天前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
11天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
41 11
|
8天前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
1月前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
1月前
|
数据采集 算法 Java
如何在Java爬虫中设置动态延迟以避免API限制
如何在Java爬虫中设置动态延迟以避免API限制
|
2月前
|
算法 Java 程序员
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
92 28
|
1月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
193 5
|
2月前
|
SQL Java 数据库连接
如何用 Java 校验 SQL 语句的合法性?
本文介绍了五种校验 SQL 语句合法性的方案:1) 使用 JDBC API 的 `execute()` 方法,通过捕获异常判断合法性;2) 使用 JSqlParser 库解析 SQL 语句为 Java 对象;3) 使用正则表达式检查 SQL 语句格式;4) 使用 ANTLR 生成 SQL 解析器;5) 使用 Apache Calcite 解析 SQL。每种方法各有优劣,具体选择取决于需求和个人偏好。需要注意的是,这些方法仅能校验语法合法性,无法保证语义正确性,仍需防范 SQL 注入攻击。
|
2月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。