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

news/2024/7/16 12:10:16

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

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

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

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

步骤2:创建模型类

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

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类的自定义验证器示例:

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方法来实例化自定义验证器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration
public class AppConfig {

    @Bean
    public Validator validator() {
        return new UserValidator();
    }

    // 其他配置类和方法...
}

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

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

@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文件并添加以下条目:

# 自定义错误消息
NotEmpty.user.username=Username cannot be empty
NotEmpty.user.email=Email cannot be empty
Size.userForm.username=Username must be at least 5 characters long

在上面的示例中,我们为NotEmpty和Size约束定义了错误消息。

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

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

POST /users
Content-Type: application/json

{
  "username": "",
  "email": "test@example.com"
}

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

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

@PostMapping
public 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/?csdn,如果你有闲暇时间,可以做个知识拓展。

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

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


http://lihuaxi.xjx100.cn/news/1595790.html

相关文章

2023年中国产业互联网行业交易规模及发展前景分析:产业互联网价值快速显现,发展潜力将进一步释放[图]

产业互联网是基于互联网技术和生态&#xff0c;对各个垂直产业的产业链和内部的价值链进行重塑和改造&#xff0c;从而形成的互联网生态和形态。产业互联网是一种新的经济形态&#xff0c;利用信息技术与互联网平台&#xff0c;充分发挥互联网在生产要素配置中的优化和集成作用…

和力链携手纷享销客推动CRM业财一体化,引领大健康产业数智化发展

两化深度融合正在加速产业转型升级、重塑产业结构&#xff0c;为传统行业注入发展新活力&#xff0c;江西和力物联实业有限公司&#xff08;以下简称“和力链”&#xff09;正是这样一家推动医药大健康产业数智化发展的高新技术企业。 和力链是国内首家大健康供应链产能数字化…

张量-数据操作相关函数

tf.slice(input,begin,size,name None),该函数对输入的数据input进行切片分割操作。其中,参数begin是一个int32或int64类型的tensor,表示的是每一个维度的起始位置。size也是一个int32或int64类型的tensor,表示的是每个维度要取的元素个数。 示例代码如下: import tensorflo…

旁注、越权、跨库、CDN相关

旁注原理 在同一服务器上有多个站点&#xff0c;我们要攻击的这个站点假设没有漏洞&#xff0c;我们可以攻击服务器上的任意一个站点&#xff0c;这个就是旁注 多端口需要知道IP 可以用尖刀&#xff0c;fscan,goby 探测 IP逆向查询&#xff08;知道域名&#xff09; 可通过pin…

一篇概全,接口测试知识盲扫,真正的接口测试是如何做的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试的基本…

HTTP协议的不同版本及其新特性

HTTP/0.9 HTTP/0.9是最早的HTTP协议版本&#xff0c;于1991年发布。它具有以下特点&#xff1a; 只支持GET方法。不支持HTTP头部信息。响应只能是HTML文本。不支持状态码。 HTTP/1.0 HTTP/1.0于1996年发布&#xff0c;是HTTP协议的第一个正式版本。它具有以下特点&#xff…

成为黄金代理,必须考虑到这一点

目前很多投资者都会选择黄金代理进行现货黄金投资账户的开立。一方面是市场中各种各样的现货黄金代理&#xff0c;越来越专业&#xff0c;提供的交易服务越来越好&#xff0c;另一方面是黄金代理和黄金平台进行合作&#xff0c;如果平台选得好&#xff0c;投资者在平台开户还是…

Switch Enum使用

Switch Enum使用 以为在Switch中使用Enum应该这样用&#xff0c;可是却编译不通过 package cn.cjf.java.enums;import lombok.AllArgsConstructor; import lombok.Getter;public class SwitchEnumTest {public static void main(String[] args) {int code 1;final EColor co…