首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何优雅构建自定义 Spring Boot 验证器,让你的代码更加丝滑!

作为一名开发人员,你应该知道确保应用程序中流动的数据的准确性和完整性是多么重要。Spring Boot 提供了强大的验证功能,但有时我们需要额外的验证,创建适合特定需求的自定义验证器。

接下来,我们来介绍下如何完整的创建一个自定义验证器。

步骤 1:准备 Spring Boot 应用程序

首先,确保你已经设置了一个 Spring Boot 项目。可以选择使用 Maven 或 Gradle 作为构建工具。在项目的配置文件(pom.xml 或 build.gradle)中包含必要的依赖项,如 spring-boot-starter-web 和 spring-boot-starter-validation。

步骤 2:创建模型类

创建一个模型类来表示要验证的数据。例如,创建一个简单的 User 类,包含一个用户名和电子邮件字段:、

代码语言:javascript
复制
public class User {    private String username;    private String email;
    // getters and setters}

复制代码

步骤 3:创建自定义验证器

接下来,通过实现 org.springframework.validation.Validator 接口来创建一个自定义验证器类。该接口定义了 supports()和 validate()两个方法。

supports()方法检查验证器是否支持给定的类。在我们的例子中,我们想要验证 User 类,所以如果提供的类是 User 类或其子类之一,则该方法应返回 true。

validate()方法执行实际的验证逻辑,我们可以访问正在验证的对象,执行检查,并使用 org.springframework.validation.Errors 对象添加验证错误。

以下是 User 类的自定义验证器示例:

代码语言:javascript
复制
import org.springframework.validation.Errors;import org.springframework.validation.ValidationUtils;import org.springframework.validation.Validator;
public class UserValidator implements Validator {
    @Override    public boolean supports(Class<?> clazz) {        return User.class.equals(clazz);    }
    @Override    public void validate(Object target, Errors errors) {        User user = (User) target;
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "NotEmpty");        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "NotEmpty");
        // Add additional validation logic        // Example:        // if (user.getUsername().length() < 5) {        //     errors.rejectValue("username", "Size.userForm.username");        // }    }}

复制代码

步骤 4:注册自定义验证器

为了让 Spring Boot 知道自定义验证器,我们需要进行注册。打开应用程序的配置类(通常使用 @Configuration 注解),并添加一个 @Bean 方法来实例化自定义验证器。

代码语言:javascript
复制
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.validation.Validator;import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configurationpublic class AppConfig {
    @Bean    public Validator validator() {        return new UserValidator();    }
    // 其他配置类和方法...}

复制代码

步骤 5:使用自定义验证器

要将自定义验证器应用于所需的端点,需要使用 @Valid 注解相应的方法参数,来触发该对象的验证过程。例如,有一个用于创建新用户的 RESTful 端点:

代码语言:javascript
复制
@RestController@RequestMapping("/users")public class UserController {
    @PostMapping    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {        // 处理用户创建逻辑
        return ResponseEntity.ok("User created successfully");    }}

复制代码

在这个例子中,对 user 参数使用 @Valid 注解表示应该使用注册的自定义验证器进行验证。

步骤 6:提供错误消息

为了给自定义验证约束提供有意义的错误消息,需要在项目的 src/main/resources 目录中创建一个 messages.properties 文件。该文件用于不同的验证约束定义自定义错误消息。打开 messages.properties 文件并添加以下条目:

代码语言:javascript
复制
# 自定义错误消息NotEmpty.user.username=Username cannot be emptyNotEmpty.user.email=Email cannot be emptySize.userForm.username=Username must be at least 5 characters long

复制代码

步骤 7:测试自定义验证器

现在,我们可以通过触发验证过程来测试自定义验证器。如果发生任何验证错误,它们将自动添加到 BindingResult 对象中。例如,假设有一个用于创建新用户的请求:

代码语言:javascript
复制
POST /usersContent-Type: application/json
{  "username": "",  "email": "test@example.com"}

复制代码

当发送这个请求时,验证过程将被触发,如果用户名字段为空,将会向 BindingResult 中添加一个验证错误。

为了处理验证错误,我们可以修改 UserController 中的 createUser 方法,如下所示:

代码语言:javascript
复制
@PostMappingpublic ResponseEntity<String> createUser(@Valid @RequestBody User user, BindingResult bindingResult) {    if (bindingResult.hasErrors()) {        // 处理验证错误        List<ObjectError> errors = bindingResult.getAllErrors();        // 按需处理并返回错误消息        // 示例: return ResponseEntity.badRequest().body(errors.toString());    }
    // 如果验证通过,继续处理用户创建逻辑
    return ResponseEntity.ok("User created successfully");}

复制代码

在这个例子中,如果存在验证错误,可以使用 bindingResult.getAllErrors()从 BindingResult 对象中检索错误。然后,根据应用程序的需求处理和处理这些错误。

这样,我们已经成功地在 Spring Boot 应用程序中创建并使用了自定义验证器。自定义验证器允许我们为特定字段或对象定义自己的验证逻辑和错误消息,从而控制验证过程。

开发界的强者

最后,介绍一款软件开发工具。JNPF 开发平台,很多人都用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。原理是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:http://www.jnpfsoft.com/?infoq,如果你有闲暇时间,可以做个知识拓展。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架,采用业内领先的 SpringBoot 微服务架构、支持 SpringCloud 模式。前后端封装了上千个常用类,方便扩展;采用微服务、前后端分离架构,集成了代码生成器,支持前后端业务代码生成,满足快速开发;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3,平台即可私有化部署,也支持 K8S 部署。

为了支撑更高技术要求的应用开发,从数据库建模、Web API 构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/a0ef39923dcb62f5260e560a7
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券