如何使用Validation进行Spring Boot参数校验?

举报
bug菌 发表于 2023/10/11 17:36:14 2023/10/11
【摘要】 🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。


🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

本专栏致力打造最硬核Spring Boot 系列教程,从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

前言

参数校验是一个常见的需求,在现代的Web应用程序中也是必不可少的功能。为了满足这种需求,Java 提供了一套 Bean Validation API ,可以在代码中轻松执行验证操作,降低了开发人员的工作量。Spring Boot 集成了 Bean Validation API,可以使用该API进行参数校验。

本文将深入介绍 Spring Boot 如何使用 Bean Validation 进行参数校验,为读者提供一些示例代码,并附上测试用例。

摘要

本文将从以下几个方面详细介绍如何使用 Bean Validation 进行参数校验:

  • Bean Validation 简介
  • 集成 Bean Validation API
  • 编写验证注解
  • 在控制器中使用 Bean Validation
  • 测试用例

Bean Validation

简介

Bean Validation 是一个 Java EE 规范,定义了一系列用于验证 Java 对象属性的 API。这些验证器可以通过注解或 XML 配置来定义,可以自定义验证。Bean Validation 实现了 JSR-303 规范,提供了一种标准的方法来验证 JavaBean 。

使用场景

Bean Validation 是一种 Java 技术,它可以通过注解在 Java Bean 属性上定义约束规则,以验证输入数据是否符合预期。以下是 Bean Validation 的使用场景和优缺点:

使用场景:

  1. 表单验证:Bean Validation 可以用来验证用户提交的表单数据是否符合要求,比如密码长度、电话号码格式等。

  2. 数据库层验证:Bean Validation 可以用来验证数据库层的数据,比如验证用户名是否已存在、验证身份证号是否正确等。

  3. 后端验证:Bean Validation 可以用来验证后端业务逻辑层的输入数据,比如验证订单金额是否大于用户余额、验证支付渠道是否允许等。

优缺点

优点:

  1. 代码简洁:Bean Validation 可以通过注解方式将验证规则与 Java Bean 属性进行绑定,代码量更少。

  2. 可重用性:Bean Validation 可以将验证规则封装在 validator 类中,可以被项目中的多个 Bean 进行重用。

  3. 验证组合:Bean Validation 可以使用注解进行验证组合。可以创建自己的注解来验证某些复杂规则。

  4. 错误报告:Bean Validation 可以生成详细的错误报告,说明哪些属性违反了哪些规则。

缺点:

  1. 不支持跨属性验证:Bean Validation 只能对单个属性进行验证,不能进行跨属性验证。

  2. 验证过程无法定制:Bean Validation 只提供了一些默认的验证规则,无法满足某些需要定制的验证规则。

  3. 对于一些复杂的业务逻辑依然需要自己手写验证的代码。

集成 Bean Validation API

在Spring Boot中集成 Bean Validation API 非常简单。Spring Boot自动配置了 Hibernate Validator(Hibernate Validator 是 Bean Validation 的实现之一)。只需要在Spring Boot应用程序的依赖中添加以下依赖即可:

添加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 添加 Bean Validation API -->
<dependency>
   <groupId>org.hibernate.validator</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>5.4.2.Final</version>
</dependency>

编写验证注解

Bean Validation 的验证器是通过注解进行定义的。例如,有一个 User 类,用户名和密码都不能为空。可以使用 @NotNull 和 @NotBlank 注解来实现:

public class User {

   @NotNull(message = "Username can not be null")
   private String username;

   @NotBlank(message = "Password can not be blank")
   private String password;

   // Getters and Setters
}

注解说明:

  • @NotNull:用于验证对象、集合、数组等非空。
  • @NotBlank:用于验证字符串是否非空字符串,也就是必须至少包含一个非空字符串字符。

在控制器中使用 Bean Validation

在控制器上使用 Bean Validation 非常简单。只需要在参数上添加注解即可。例如,下面是一个简单的 User 控制器:

@RestController
public class UserController {

   @PostMapping("/users")
   public ResponseEntity createUser(@Valid @RequestBody User user) {
       // 处理请求
       return ResponseEntity.ok().build();
   }
}

@Valid 标记用于告诉 Spring Boot 对象需要进行验证。@RequestBody 注解用于从请求中获取 User 对象。

测试用例

为了测试 Bean Validation,可以使用 MockMvc 来测试上面的 UserController。下面是一个测试用例的示例:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
 
    @Autowired
    private MockMvc mockMvc;
 
    @Test
    public void createUser_WithInvalidInputs_ShouldReturnBadRequest() throws Exception {
        User user = new User();
        user.setUsername(null);
        user.setPassword("");
 
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);
 
        mockMvc.perform(post("/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(json))
                .andExpect(status().isBadRequest())
                .andExpect(jsonPath("$.errors", hasSize(2)))
                .andExpect(jsonPath("$.errors[*].field", containsInAnyOrder("username", "password")));
    }
 
    @Test
    public void createUser_WithValidInputs_ShouldCreateUser() throws Exception {
        User user = new User();
        user.setUsername("testuser");
        user.setPassword("password");
 
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);
 
        mockMvc.perform(post("/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(json))
                .andExpect(status().isOk());
    }
}

测试代码解析

这段代码是一个基于 Spring Boot 的测试类,用于测试 UserController 的两个方法:createUser_WithInvalidInputs_ShouldReturnBadRequest 和 createUser_WithValidInputs_ShouldCreateUser。

该测试类使用了 Mockito 的 MockMvc 进行模拟请求,并使用了 JUnit 的测试框架进行断言。

在第一个测试方法中,使用了一个不合法的用户对象进行模拟请求,然后断言该请求应该返回 HTTP 400 错误,并且响应的 JSON 中应该包含一个名为 “errors” 的数组,其中应该有两个元素:一个名为 “username” 的错误和一个名为 “password” 的错误。

在第二个测试方法中,使用了一个合法的用户对象进行模拟请求,然后断言该请求应该返回 HTTP 200 成功状态。

测试结果

无法确定执行结果,需要根据实际运行环境和代码情况进行测试。但是,可以分析一下代码的作用和预期结果:

  1. 第一个测试方法会创建一个User对象,并将其用户名设置为null,密码设置为空字符串,然后将其转换为JSON字符串并发送到“/users”端点。预期结果是返回HTTP状态码为400(BadRequest),并且返回的JSON响应中应包含2个错误,分别对应于用户名和密码字段。

  2. 第二个测试方法会创建一个User对象,并将其用户名设置为“testuser”,密码设置为“password”,然后将其转换为JSON字符串并发送到“/users”端点。预期结果是返回HTTP状态码为200(OK),表示成功创建了一个用户。

需要注意的是,这些测试方法使用了Spring Boot提供的MockMvc框架来模拟一个HTTP请求,并验证返回的响应是否符合预期。这种方式既可以用于测试控制器方法的功能,也可以用于测试REST API的接口。

测试用例演示如下:

image.png
image.png
image.png

小结

本文介绍了 Spring Boot 如何使用 Bean Validation 进行参数校验。首先介绍了 Bean Validation 的概念,接着演示了如何集成 Bean Validation API、编写验证注解和在控制器中使用 Bean Validation。最后,通过测试用例来验证代码的正确性。

附录源码

  如上涉及所有源码均已上传同步在「GitHub」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

总结

本文介绍了 Spring Boot 如何使用 Bean Validation 进行参数校验。首先介绍了 Bean Validation 的概念和集成方式,接着演示了如何编写验证注解和在控制器中使用 Bean Validation。最后,通过测试用例来验证代码的正确性。通过本文的学习,读者可以了解到如何使用 Bean Validation 来简化参数校验的操作,从而提高开发效率和代码质量。

☀️建议/推荐你


无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Spring Boot」,从入门到精通,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。