首页 > 其他分享 >【揭秘】如何用ConstraintValidator自定义校验注解,让你的代码更简洁高效!

【揭秘】如何用ConstraintValidator自定义校验注解,让你的代码更简洁高效!

时间:2024-10-28 13:46:26浏览次数:9  
标签:自定义 校验 注解 import ConstraintValidator validation public

在Java中,自定义校验注解(Custom Validation Annotation)通常用于Bean Validation框架(如Hibernate Validator),以便对特定字段或方法参数进行验证。以下是如何创建和使用自定义校验注解的详细步骤和代码示例:

1. 定义自定义校验注解

首先,我们需要定义一个自定义校验注解。这个注解需要使用@Constraint注解来指定它所关联的校验器类。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = MyCustomValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomConstraint {
    String message() default "Invalid value";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2. 实现校验逻辑

接下来,我们需要创建一个实现了ConstraintValidator接口的类,该类包含具体的校验逻辑。

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MyCustomValidator implements ConstraintValidator<MyCustomConstraint, String> {

    @Override
    public void initialize(MyCustomConstraint constraintAnnotation) {
        // 初始化方法,可以在这里获取注解的属性值
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null || value.isEmpty()) {
            return false; // 校验失败
        }
        // 这里可以添加更多的校验逻辑,例如正则表达式匹配等
        return value.matches("^[a-zA-Z0-9]+$"); // 仅允许字母和数字
    }
}

3. 应用自定义校验注解

现在,我们可以在实体类或方法参数上使用自定义校验注解。

在实体类中使用
import javax.validation.constraints.NotNull;

public class User {
    @NotNull(message = "Username cannot be null")
    @MyCustomConstraint(message = "Username must be alphanumeric")
    private String username;

    // getters and setters
}
在方法参数中使用
import javax.validation.Valid;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {

    @PostMapping("/users")
    public String createUser(@RequestBody @Valid User user) {
        // 如果user对象中的username字段不符合自定义校验规则,将抛出异常
        return "User created successfully!";
    }
}

4. 配置Spring Boot以启用验证

确保你的Spring Boot应用程序已启用了验证功能。通常情况下,Spring Boot会自动配置,但你可以显式地在配置类中启用它。

import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

@Configuration
public class ValidationConfig {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}

5. 测试自定义校验注解

最后,编写单元测试来验证自定义校验注解是否按预期工作。

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import java.util.Set;

public class CustomValidatorTest {
    private final Validator validator;

    public CustomValidatorTest() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }

    @Test
    public void testCustomValidator() {
        User user = new User();
        user.setUsername("validUsername123"); // 合法值
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        assertTrue(violations.isEmpty());

        user.setUsername("invalid username!"); // 非法值
        violations = validator.validate(user);
        assertFalse(violations.isEmpty());
        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getMessage()); // 输出错误信息
        }
    }
}

通过以上步骤,我们成功创建了一个自定义校验注解,并在Spring Boot项目中进行了应用和测试。这样,我们就可以根据业务需求灵活地定义各种复杂的校验规则。

标签:自定义,校验,注解,import,ConstraintValidator,validation,public
From: https://blog.csdn.net/LA1245780/article/details/143300906

相关文章

  • GaussDB数据库SQL系列-自定义函数
    一、前言华为云GaussDB数据库是一款高性能、高安全性的云原生数据库,在GaussDB中,自定义函数是一个不容忽视的重要功能。本文将简单介绍一下自定义函数在GaussDB中的使用场景、使用优缺点、示例及示例解析等,为读者提供指导与帮助。二、自定义函数(Function)概述在SQL中,自定义函数(Fu......
  • 13 Docker容器单机网络架构全攻略:使用自定义桥接的实践与探索
    文章目录Docker容器单机网络架构全攻略:使用自定义桥接的**实践与探索**五使用自定义docker桥接网络5.1重新创建新的容器5.2重新创建新的容器,并且指定网络5.3docker网桥切换Docker容器单机网络架构全攻略:使用自定义桥接的实践与探索五使用自定义do......
  • [笔记] SpringBoot3 使用 EasyExcel 封装工具类实现 自定义表头 导出并实现 数据格式
    在现代企业应用中,数据导出功能是非常常见的需求。特别是在处理大量数据时,将数据导出为Excel文件不仅方便用户查看和分析,还能提高数据处理的效率。ApachePOI是一个常用的JavaExcel处理库,但它在处理大数据量时性能较差。为此,阿里巴巴开源了EasyExcel,这是一个基于Java......
  • Flutter 自定义组件继承与调用的高级使用方式
    ✅近期推荐:求职神器https://bbs.csdn.net/topics/619384540......
  • 博客园自定义页面样式
    TheFirsttoSay花了两天,重写了博客的页面样式。整体风格是按照_darkgreentrip_的风格去改的,使之更接近苯人的风格。最后在结尾放了一些格子可以用来导航,有好用的网站大概会放在这里。自己其实有做过导航站,但是由于挂在GitHub上,网速比较慢,现在扔在下面平时也稍微能用用()下面贴......
  • 微服务网关gateway过滤器工厂与自定义过滤器
    gateway过滤器工厂与自定义过滤器过滤器工厂GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:1.路由过滤器的种类Spring提供了31种不同的路由过滤器工厂。例如:名称说明AddRequestHeader给当前请求添加一个请求头RemoveRequestHead......
  • kube-prometheus-stack 自定义 alertmanager 配置推送webhook
    创建AlertmanagerConfig资源在没有使用prometheus-operator的情况下,需要手动配置alertmanager.yaml来路由&发送从prometheus接收的警报。使用prometheus-operator之后,事情变得简单一些。只需要创建AlertmanagerConfig资源,prometheus-operator会自动merge所有的Ale......
  • 化学仿真软件:Aspen Plus二次开发_自定义模型开发
    自定义模型开发1.介绍AspenPlus是一种广泛应用于化工过程模拟和优化的软件工具。在许多情况下,标准模型库中的模型可能无法满足特定工艺的需求。因此,自定义模型开发成为提高仿真精度和效率的重要手段。本节将详细介绍如何在AspenPlus中开发自定义模型,包括模型开发的......
  • 学习笔记(五):自定义构建函数
    若自定义的组件内部UI结构固定,且仅与使用方进行数据传递。则无需单独写一个自定义组件文件,可直接在使用方内进行定义。即UI元素复用机制@Builder,@Builder所装饰的函数遵循build()函数语法规则,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。定义一个自定义构建......
  • WPF+Mvvm案例实战(五)- 自定义雷达图实现
    文章目录1、项目准备1、创建文件2、用户控件库2、功能实现1、用户控件库1、控件样式实现2、数据模型实现2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造:2、按钮添加:3、依赖注入3、运行效果4、源代码获取1、项目准......